πŸ§‘πŸ»‍πŸ’» Coding Test/⌨️ Programmers

[ ν”„λ‘œκ·Έλž˜λ¨ΈμŠ€ ] λŒ€μΆ© λ§Œλ“  자판

EarthSea 2024. 3. 14. 10:10

 

 

πŸ„ μ½”λ”©ν…ŒμŠ€νŠΈ

μ½”λ”©ν…ŒμŠ€νŠΈ 문제 풀이

✍🏻 Github

문제 풀이 github 링크

 

 

문제 μ„€λͺ…

νœ΄λŒ€ν°μ˜ μžνŒμ€ 컴퓨터 ν‚€λ³΄λ“œ μžνŒκ³ΌλŠ” λ‹€λ₯΄κ²Œ ν•˜λ‚˜μ˜ 킀에 μ—¬λŸ¬ 개의 λ¬Έμžκ°€ 할당될 수 μžˆμŠ΅λ‹ˆλ‹€. ν‚€ ν•˜λ‚˜μ— μ—¬λŸ¬ λ¬Έμžκ°€ ν• λ‹Ήλœ 경우, λ™μΌν•œ ν‚€λ₯Ό μ—°μ†ν•΄μ„œ λΉ λ₯΄κ²Œ λˆ„λ₯΄λ©΄ ν• λ‹Ήλœ μˆœμ„œλŒ€λ‘œ λ¬Έμžκ°€ λ°”λ€λ‹ˆλ‹€.

예λ₯Ό λ“€μ–΄, 1번 킀에 "A", "B", "C" μˆœμ„œλŒ€λ‘œ λ¬Έμžκ°€ ν• λ‹Ήλ˜μ–΄ μžˆλ‹€λ©΄ 1번 ν‚€λ₯Ό ν•œ 번 λˆ„λ₯΄λ©΄ "A", 두 번 λˆ„λ₯΄λ©΄ "B", μ„Έ 번 λˆ„λ₯΄λ©΄ "C"κ°€ λ˜λŠ” μ‹μž…λ‹ˆλ‹€.

같은 κ·œμΉ™μ„ μ μš©ν•΄ μ•„λ¬΄λ ‡κ²Œλ‚˜ λ§Œλ“  νœ΄λŒ€ν° 자판이 μžˆμŠ΅λ‹ˆλ‹€. 이 νœ΄λŒ€ν° μžνŒμ€ ν‚€μ˜ κ°œμˆ˜κ°€ 1κ°œλΆ€ν„° μ΅œλŒ€ 100κ°œκΉŒμ§€ μžˆμ„ 수 있으며, νŠΉμ • ν‚€λ₯Ό λˆŒλ €μ„ λ•Œ μž…λ ₯λ˜λŠ” λ¬Έμžλ“€λ„ λ¬΄μž‘μœ„λ‘œ λ°°μ—΄λ˜μ–΄ μžˆμŠ΅λ‹ˆλ‹€. 또, 같은 λ¬Έμžκ°€ 자판 전체에 μ—¬λŸ¬ 번 ν• λ‹Ήλœ κ²½μš°λ„ 있고, ν‚€ ν•˜λ‚˜μ— 같은 λ¬Έμžκ°€ μ—¬λŸ¬ 번 ν• λ‹Ήλœ κ²½μš°λ„ μžˆμŠ΅λ‹ˆλ‹€. 심지어 μ•„μ˜ˆ ν• λ‹Ήλ˜μ§€ μ•Šμ€ κ²½μš°λ„ μžˆμŠ΅λ‹ˆλ‹€. λ”°λΌμ„œ λͺ‡λͺ‡ λ¬Έμžμ—΄μ€ μž‘μ„±ν•  수 없을 μˆ˜λ„ μžˆμŠ΅λ‹ˆλ‹€.

이 νœ΄λŒ€ν° μžνŒμ„ μ΄μš©ν•΄ νŠΉμ • λ¬Έμžμ—΄μ„ μž‘μ„±ν•  λ•Œ, ν‚€λ₯Ό μ΅œμ†Œ λͺ‡ 번 λˆŒλŸ¬μ•Ό κ·Έ λ¬Έμžμ—΄μ„ μž‘μ„±ν•  수 μžˆλŠ”μ§€ μ•Œμ•„λ³΄κ³ μž ν•©λ‹ˆλ‹€.

1번 ν‚€λΆ€ν„° μ°¨λ‘€λŒ€λ‘œ ν• λ‹Ήλœ λ¬Έμžλ“€μ΄ μˆœμ„œλŒ€λ‘œ λ‹΄κΈ΄ λ¬Έμžμ—΄λ°°μ—΄ keymapκ³Ό μž…λ ₯ν•˜λ €λŠ” λ¬Έμžμ—΄λ“€μ΄ λ‹΄κΈ΄ λ¬Έμžμ—΄ λ°°μ—΄ targetsκ°€ μ£Όμ–΄μ§ˆ λ•Œ, 각 λ¬Έμžμ—΄μ„ μž‘μ„±ν•˜κΈ° μœ„ν•΄ ν‚€λ₯Ό μ΅œμ†Œ λͺ‡ λ²ˆμ”© λˆŒλŸ¬μ•Ό ν•˜λŠ”μ§€ μˆœμ„œλŒ€λ‘œ 배열에 λ‹΄μ•„ return ν•˜λŠ” solution ν•¨μˆ˜λ₯Ό μ™„μ„±ν•΄ μ£Όμ„Έμš”.

단, λͺ©ν‘œ λ¬Έμžμ—΄μ„ μž‘μ„±ν•  수 없을 λ•ŒλŠ” -1을 μ €μž₯ν•©λ‹ˆλ‹€.

 

μ œν•œμ‚¬ν•­

  • 1 ≤ keymap의 길이 ≤ 100
    • 1 ≤ keymap의 μ›μ†Œμ˜ 길이 ≤ 100
    • keymap[i]λŠ” i + 1번 ν‚€λ₯Ό λˆŒλ €μ„ λ•Œ μˆœμ„œλŒ€λ‘œ λ°”λ€ŒλŠ” 문자λ₯Ό μ˜λ―Έν•©λ‹ˆλ‹€.
      • 예λ₯Ό λ“€μ–΄ keymap[0] = "ABACD" 인 경우 1번 ν‚€λ₯Ό ν•œ 번 λˆ„λ₯΄λ©΄ A, 두 번 λˆ„λ₯΄λ©΄ B, μ„Έ 번 λˆ„λ₯΄λ©΄ A κ°€ λ©λ‹ˆλ‹€.
    • keymap의 μ›μ†Œμ˜ κΈΈμ΄λŠ” μ„œλ‘œ λ‹€λ₯Ό 수 μžˆμŠ΅λ‹ˆλ‹€.
    • keymap의 μ›μ†ŒλŠ” μ•ŒνŒŒλ²³ λŒ€λ¬Έμžλ‘œλ§Œ 이루어져 μžˆμŠ΅λ‹ˆλ‹€.
  • 1 ≤ targets의 길이 ≤ 100
    • 1 ≤ targets의 μ›μ†Œμ˜ 길이 ≤ 100
    • targets의 μ›μ†ŒλŠ” μ•ŒνŒŒλ²³ λŒ€λ¬Έμžλ‘œλ§Œ 이루어져 μžˆμŠ΅λ‹ˆλ‹€

 

μž…μΆœλ ₯ 예

keymap targets result
["ABACD", "BCEFD"] ["ABCD","AABB"] [9, 4]
["AA"] ["B"] [-1]
["AGZ", "BSSS"] ["ASA","BGZ"] [4, 6]

 

μž…μΆœλ ₯ 예 μ„€λͺ…

μž…μΆœλ ₯ 예 #1

  • "ABCD"의 경우,
  • 1번 ν‚€ ν•œ 번 → A
  • 2번 ν‚€ ν•œ 번 → B
  • 2번 ν‚€ 두 번 → C
  • 1번 ν‚€ λ‹€μ„― 번 → D
  • λ”°λΌμ„œ 총합인 9λ₯Ό 첫 번째 μΈλ±μŠ€μ— μ €μž₯ν•©λ‹ˆλ‹€.
  • "AABB"의 경우,
  • 1번 ν‚€ ν•œ 번 → A
  • 1번 ν‚€ ν•œ 번 → A
  • 2번 ν‚€ ν•œ 번 → B
  • 2번 ν‚€ ν•œ 번 → B
  • λ”°λΌμ„œ 총합인 4λ₯Ό 두 번째 μΈλ±μŠ€μ— μ €μž₯ν•©λ‹ˆλ‹€.
  • 결과적으둜 [9,4]λ₯Ό return ν•©λ‹ˆλ‹€.

μž…μΆœλ ₯ 예 #2

  • "B"의 경우, 'B'κ°€ 어디에도 μ‘΄μž¬ν•˜μ§€ μ•ŠκΈ° λ•Œλ¬Έμ— -1을 첫 번째 μΈλ±μŠ€μ— μ €μž₯ν•©λ‹ˆλ‹€.
  • 결과적으둜 [-1]을 return ν•©λ‹ˆλ‹€.

μž…μΆœλ ₯ 예 #3

  • "ASA"의 경우,
  • 1번 ν‚€ ν•œ 번 → A
  • 2번 ν‚€ 두 번 → S
  • 1번 ν‚€ ν•œ 번 → A
  • λ”°λΌμ„œ 총합인 4λ₯Ό 첫 번째 μΈλ±μŠ€μ— μ €μž₯ν•©λ‹ˆλ‹€.
  • "BGZ"의 경우,
  • 2번 ν‚€ ν•œ 번 → B
  • 1번 ν‚€ 두 번 → G
  • 1번 ν‚€ μ„Έ 번 → Z
  • λ”°λΌμ„œ 총합인 6을 두 번째 μΈλ±μŠ€μ— μ €μž₯ν•©λ‹ˆλ‹€.
  • 결과적으둜 [4, 6]을 return ν•©λ‹ˆλ‹€.

 

 

문제 풀이

λ‚˜μ˜ 풀이

import Foundation

func solution(_ keymap:[String], _ targets:[String]) -> [Int] {
    // 문자의 μ΅œμ†Œ 클릭 수
    var clickOfChar = Dictionary<Character, Int>()
    var count: Int = 0
    var answer = [Int]()
    // 문자의 μ΅œμ†Œ 클릭수 μ°ΎκΈ°
    func searchMinClick(_ alphabet: Character) -> Int {
        for key in keymap {
            if key.contains(alphabet) {
                let value = Array(key).firstIndex(of: alphabet)! + 1
                if value < clickOfChar[alphabet] ?? -1 || clickOfChar[alphabet] == nil {
                     clickOfChar[alphabet] = value
                }
            } 
        }
        return clickOfChar[alphabet] ?? -1
    }
    // λ¬Έμžμ—΄μ˜ μ΅œμ†Œ 클릭수 κ΅¬ν•˜κΈ°
    for str in targets {
        for char in str {
            if let c = clickOfChar[char] {
                count += c
            }else{
                let s = searchMinClick(char)
                if s == -1 {
                    count = -1
                    break
                }else {
                    count += s
                }
            }
        }
        answer.append(count)
        count = 0
    }
    return answer
}

 

μš°μ„  무쑰건 keymapκ³Ό targets을 νƒμƒ‰ν•΄μ•Όν•œλ‹€λŠ” 생각에

μ‹œκ°„λ³΅μž‘λ„λ₯Ό μ–΄λ–»κ²Œ ν•˜λ©΄ 쀄일 수 μžˆμ„κΉŒλ₯Ό μƒκ°ν–ˆλ˜ 것 κ°™λ‹€.

 

λ‚˜λŠ” λ”•μ…”λ„ˆλ¦¬μ— λ¬Έμžμ™€ κ·Έ 문자의 μ΅œμ†Œ 클릭수λ₯Ό λ„£κΈ°λ‘œ ν–ˆλ‹€.

그럼 targetsλ₯Ό νƒμƒ‰ν•˜μ—¬ 문제λ₯Ό ν’€ λ•Œ, 이미 μΆ”λ‘ ν–ˆλ˜ 문자라면 또 λ‹€μ‹œ λ°˜λ³΅λ¬Έμ„ λŒμ§€ μ•Šμ•„λ„ λ˜λ‹ˆκΉ

λ§Œμ•½ “ABC”λ¬Έμžμ—΄μ˜ μ΅œμ†Œ 클릭수λ₯Ό 찾고자 ν•  λ•Œ,

“A”λΌλŠ” 문자λ₯Ό νƒμƒ‰ν•΄μ•Όν•˜λŠ”λ° 이미 μ•žμ—μ„œ “ERTA”λ¬Έμžμ—΄μ„ νƒμƒ‰ν•˜μ—¬

λ”•μ…”λ„ˆλ¦¬μ— “A”의 μ΅œμ†Œ 클릭 μˆ˜κ°€ 1이라고 좔둠을 ν–ˆλ‹€λ©΄

λ‹€μ‹œ λ°˜λ³΅λ¬Έμ„ 돌면 μ΅œμ†Œ 클릭 수λ₯Ό 찾지 μ•Šμ•„λ„ λœλ‹€.

 

μ΄λ ‡κ²Œ ν’€κΈ° μœ„ν•΄μ„œλŠ” ν•΄λ‹Ή λ¬Έμžμ— λŒ€ν•œ μ΅œμ†Œ 클릭수λ₯Ό κ΅¬ν•˜λŠ” 뢀뢄이 λ”°λ‘œ κ΅¬ν˜„μ΄ λ˜μ–΄μ•Ό ν–ˆλ‹€.

κ·Έλž˜μ„œ ν•¨μˆ˜μ•ˆμ— ν•¨μˆ˜λ‘œ κ΅¬ν˜„μ„ ν•˜μ˜€λ‹€.

 

λ”•μ…”λ„ˆλ¦¬μ— μ΅œμ†Œ 문자 클릭수λ₯Ό λŒ€μž…ν•˜κΈ° μœ„ν•΄μ„œλŠ”

μš°μ„  ν•΄λ‹Ή λ¬Έμžμ—΄μ— λ¬Έμžκ°€ λ“€μ–΄μžˆλŠ”μ§€λ₯Ό νŒλ‹¨μ„ ν•˜κ³ 

λ¬Έμžμ—΄μ΄ λ“€μ–΄μžˆλ‹€λ©΄, λͺ‡ 번째 λ¬Έμžμ—΄μΈμ§€λ₯Ό λ°°μ—΄μ˜ 인덱슀λ₯Ό ν™œμš©ν•΄ κ΅¬ν–ˆλ‹€.

κ΅¬ν•œ μΈλ±μŠ€κ°€ 이미 λ”•μ…”λ„ˆλ¦¬μ— μžˆλŠ”μ§€ μ—†λŠ”μ§€λ₯Ό νŒλ‹¨ν•˜κ³ 

λ§Œμ•½ μžˆλ‹€λ©΄ 값비ꡐλ₯Ό 톡해 더 μž‘μ€ 클릭수λ₯Ό μ—…λ°μ΄νŠΈ ν•˜λ„λ‘ κ΅¬ν˜„μ„ ν•˜μ˜€λ‹€.

 

 

자판.. μ§„μ§œ λŒ€μΆ© λ§Œλ“€μ—ˆλ„€..