휴대폰의 자판은 컴퓨터 키보드 자판과는 다르게 하나의 키에 여러 개의 문자가 할당될 수 있습니다. 키 하나에 여러 문자가 할당된 경우, 동일한 키를 연속해서 빠르게 누르면 할당된 순서대로 문자가 바뀝니다.
예를 들어, 1번 키에 "A", "B", "C" 순서대로 문자가 할당되어 있다면 1번 키를 한 번 누르면 "A", 두 번 누르면 "B", 세 번 누르면 "C"가 되는 식입니다.
같은 규칙을 적용해 아무렇게나 만든 휴대폰 자판이 있습니다. 이 휴대폰 자판은 키의 개수가 1개부터 최대 100개까지 있을 수 있으며, 특정 키를 눌렀을 때 입력되는 문자들도 무작위로 배열되어 있습니다. 또, 같은 문자가 자판 전체에 여러 번 할당된 경우도 있고, 키 하나에 같은 문자가 여러 번 할당된 경우도 있습니다. 심지어 아예 할당되지 않은 경우도 있습니다. 따라서 몇몇 문자열은 작성할 수 없을 수도 있습니다.
이 휴대폰 자판을 이용해 특정 문자열을 작성할 때, 키를 최소 몇 번 눌러야 그 문자열을 작성할 수 있는지 알아보고자 합니다.
1번 키부터 차례대로 할당된 문자들이 순서대로 담긴 문자열배열 keymap과 입력하려는 문자열들이 담긴 문자열 배열 targets가 주어질 때, 각 문자열을 작성하기 위해 키를 최소 몇 번씩 눌러야 하는지 순서대로 배열에 담아 return 하는 solution 함수를 완성해 주세요.
단, 목표 문자열을 작성할 수 없을 때는 -1을 저장합니다.
import Foundation
func solution(_ keymap:[String], _ targets:[String]) -> [Int] {
var keyDict: [Character: Int] = [:]
var answer: [Int] = [], result = 0
var targets = targets
for key in keymap {
var i = 1
for k in key {
if keyDict[k] == nil {
keyDict[k] = i
} else {
keyDict[k] = keyDict[k]! <= i ? keyDict[k] : i
}
i += 1
}
}
for (index, target) in targets.enumerated() {
for char in target {
if let count = keyDict[char] {
result += count
} else {
result = -1
break
}
}
answer.append(result)
result = 0
}
return answer
}
알고리즘 풀면서 처음으로 딕셔너리 자료형을 사용했다. 특정 알파벳을 입력하기 위해서 버튼을 눌러야하는 최소한의 횟수를 짝지어 keyDict
딕셔너리에 저장했다. 똑같은 알파벳이 여러 키맵에 존재한다면, 가장 적은 버튼누르는 횟수를 같이 저장하면 된다.
이후에는 목표하는 문자열을 순회하면서 딕셔너리에 있는 값과 비교하고, 일치하는 경우에는 해당 알파벳의 짝이 된 정수형을 결과값에 더해주면 문제 풀이 끝.
.enumerated()
: 배열의 요소를 인덱스와 같이 짝지어 각각의 튜플로 반환해주는 메소드