⌨️ Language/swift

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

hyebin (Helia) 2023. 3. 19. 13:12
λ°˜μ‘ν˜•
ν”„λ‘œκ·Έλž˜λ¨ΈμŠ€ LV.1 λͺ¨μŒ

λŒ€μΆ© λ§Œλ“  자판

문제 μ„€λͺ…

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

 

예λ₯Ό λ“€μ–΄, 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 dict = [String: Int]()
    var keymap = keymap.map{$0.map{String($0)}}
    var result = [Int]()
    
    for k in keymap{
        for i in k{
            if dict[i] == nil {
                dict[i] = k.firstIndex(of: i)!
            }else{
                dict[i] = min(dict[i]!, k.firstIndex(of: i)!)
            }
        }
    }
    
    for target in targets {
        var sum = 0
        for t in target.map{String($0)} {
            if dict[t] == nil {
                sum = -1
                break
            }else{
                sum += dict[t]!+1
            }
        }
        result.append(sum)
    }
    
    return result
}
keymap의 문자λ₯Ό key둜 μˆœμ„œλ₯Ό value둜 κ°–λŠ” λ”•μ…”λ„ˆλ¦¬ dictλ₯Ό μ„ μ–Έν•œλ‹€.
keymap은 Stringν˜• 2차원 λ°°μ—΄λ‘œ λ³€ν™˜ν•œλ‹€. 결괏값을 μ €μž₯ν•  Intν˜• λ°°μ—΄  resultλ₯Ό μ„ μ–Έν•œλ‹€.

keymapμ—μ„œ 문자λ₯Ό dict에 처음 μΆ”κ°€ν•  λ•Œ(value == nil), 문자의 첫 번째 인덱슀λ₯Ό μ €μž₯ν•œλ‹€.
이미 dict에 문자λ₯Ό key둜 κ°–λŠ” valueκ°€ μ‘΄μž¬ν•œλ‹€λ©΄, κΈ°μ‘΄ valueκ°’κ³Ό 문자의 첫 번째 인덱슀 μ€‘μ—μ„œ μž‘μ€ 값을 μ €μž₯ν•œλ‹€.
(μž…μΆœλ ₯ μ˜ˆμ‹œ 1μ—μ„œ 첫 번째 keymapμ—μ„œ "B"의 μœ„μΉ˜λŠ” 1번인데, 두 번째 keymapμ—μ„œλŠ” 0λ²ˆμ΄λ‹€. 이럴 경우 0이 μ €μž₯λœλ‹€)

tartgetsλ°°μ—΄μ—μ„œ target의 λ¬Έμžκ°€ dict에 μ—†λ‹€λ©΄ sum λ³€μˆ˜μ— -1을 μ €μž₯ν•˜κ³  for문을 μ’…λ£Œν•œλ‹€.
target의 λ¬Έμžκ°€ dict에 μžˆλ‹€λ©΄, sum에 dict[t]+1을 λ”ν•œλ‹€.
result에 sum을 μΆ”κ°€ν•œλ‹€.
λ°˜μ‘ν˜•