Programmers '대충 만든 자판' 문제 보러가기
자판을 눌러 입력하려는 문자열마다 키배열keymap
을 순회하여 더 적게 누를 수 있는 횟수를 헤아렸다.
function solution(keymap, targets) {
var answer = [];
targets.forEach((target)=>{
let sum=0;
for(let i=0;i<target.length;i++){
let pressCnt = 987654321;
for(let j=0;j<keymap.length;j++){
const curKeyIdx = keymap[j].indexOf(target[i]);
// 찾을 수 없는 경우는 제외
if(curKeyIdx !== -1){
pressCnt = Math.min(pressCnt, curKeyIdx);
}
}
// 찾을 수 없는 글자가 나온다면 바로 종료
if(pressCnt === 987654321){
sum = -1;
break;
}
sum+=pressCnt+1; // index 값을 기준으로 받아왔으므로 +1
}
answer.push(sum);
});
return answer;
}
*신대호 님의 코드를 참고하였습니다.
function solution(keymap, targets) {
var answer = [];
var minKeypad = {}; // 한 문자를 표시하기 위해 눌러야하는 최소한의 횟수를 저장하는 맵
// 한 문자를 표시하기 위해 눌러야 하는 가장 작은 수를 탐색한다
for(const keys of keymap){
keys.split('').map((key,i) => minKeypad[key] = (minKeypad[key] < i+1 ? minKeypad[key] : i+1));
}
for(const target of targets){
answer.push(target.split('').reduce((sum, char) => sum += minKeypad[char],0) || -1); // 없는 경우 -1을 입력
}
return answer;
}