keymap의 길이는 자판의 개수라고 생각하면된다.
각각 자판을 누를때마다 연속적으로 어떤 문자가 나오는지를 담고있다.
최소로 누르고 싶은거니까 keymap에 있는 문자는 굳이 구별을 하지 않아도 된다고 생각한다.
keymap[0]이든 keymap[1]이든 빨리 해당 문자가 나오는걸 연속으로 누르면된다.
그럼 같은 문자를 보여주는 다른 자판이라도 문자를 빨리 보여주는 횟수만 저장하면된다.
예를 들어 [ABACD][BCEFD]가 있을때
C를 뽑기위해 가장 빠른 자판의 횟수는 2이다.
그냥 C는 2번 누르면된다라고 저장할 수 있다.
이를 위해 Hash를 사용했다.
function solution(keymap, targets) {
const hash = new Map()
keymap = keymap.map((string)=>(string.split(``)))
keymap.forEach((arr)=>arr.forEach((char,i)=>{
if(!hash.get(char) || hash.get(char)>i+1){
hash.set(char,i+1)
}
}))
const result=[]
for(let i = 0 ; i <targets.length; i++){
let sum=0
for(let j = 0 ; j<targets[i].length; j++){
const char = targets[i][j]
if(!hash.get(char)){
return [-1]
}
sum=sum+hash.get(char)
}
result.push(sum)
}
return result
}
이렇게 각 자판을 구별하지 않고 해당 문자를 최소로 눌렀을때 나올 수 있는 수를 key-value로 저장하였다.
이런식으로.
절반의 테스트 케이스를 통과하지 못했다.
자세히 보니 문제를 잘못 읽었다.
문제를 제대로 읽는 것이 중요하다
만약 찾는 문자가 없을때 [-1]을 반환하는 것이 아닌 해당 target에 대해서 -1을 result 배열에 저장해서 Return하는 문제였다.
function solution(keymap, targets) {
const hash = new Map()
keymap = keymap.map((string)=>(string.split(``)))
keymap.forEach((arr)=>arr.forEach((char,i)=>{
if(!hash.get(char) || hash.get(char)>i+1){
hash.set(char,i+1)
}
}))
const result=[]
for(let i = 0 ; i <targets.length; i++){
let sum=0
for(let j = 0 ; j<targets[i].length; j++){
const char = targets[i][j]
if(!hash.get(char)){
sum=-1
break;
}
sum=sum+hash.get(char)
}
result.push(sum)
}
return result
}