[JS] Programmers 160586 대충 만든 자판

서연주·2023년 7월 17일
0

Algorithm

목록 보기
23/25

'대충 만든 자판'

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;
}

개선하기

*신대호 님의 코드를 참고하였습니다.

  1. map을 사용하여 반복되는 키패드 탐색 과정 생략
  2. 삼항 연산자를 사용하여 간결한 로직 처리
  3. reduce를 사용한 가독성 향상
    최종 값을 합산하는 데에서 reduce를 사용
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;
}

참고 자료

profile
pizz@ttang

0개의 댓글