티스토리 뷰

 

이 문제는 일단 문자-키를 매핑해주는 게 가장 중요하다.

1. 문자 - 키 매핑
2. target 문자열 처리
3. 결과 반환

따라서, 어떻게 문제를 매핑해줘야하는지에 대한 부분에 신경써서 문제를 풀었다.

 

먼저 객체를 생성해주고, 

그 부분에 문자와 키를 매핑해주었다.

 

keymap 배열을 순회하며 각 키가 할당된 객체를 만들어,

딕셔너리에 저장해주었다.

    const charPresses = {};

    keymap.forEach((key) => {
        for (let i = 0; i < key.length; i++) {
            const char = key[i];
            const presses = i + 1;
            if (!charPresses[char] || presses < charPresses[char]) {
                charPresses[char] = presses;
            }
        }
    });

 

이후 targets 배열을 순회하며 target 문자열에 대한 최소 횟수를 계산했다.

만약 입력할 수 없다면 -1을 반환하는 코드 역시 제작했다.

 

다음은 구현한 코드이다.

 

구현 코드

function solution(keymap, targets) {
    const charPresses = {};

    keymap.forEach((key) => {
        for (let i = 0; i < key.length; i++) {
            const char = key[i];
            const presses = i + 1;
            if (!charPresses[char] || presses < charPresses[char]) {
                charPresses[char] = presses;
            }
        }
    });

    return targets.map(target => {
        let totalPresses = 0;

        for (const char of target) {
            if (!charPresses[char]) {
                return -1;
            }
            totalPresses += charPresses[char];
        }

        return totalPresses;
    });
}

 

다른 사람의 코드

function solution(keymap, targets) {
    const answer = [];
    const map = {}
    for (const items of keymap) {
        items.split('').map((item, index) => map[item] = (map[item] < index+1 ? map[item] : index+1))
    }
    for (const items of targets) {
        answer.push(items.split('').reduce((cur, item) => cur += map[item], 0) || -1)
    }
    return answer;
}

 

더 깔끔하지만 초심자에게는 내 코드가 조금 더 가독성있을 것 같다.

시간복잡도를 간단하게 계산해보았는데,

어차피 둘 다 keymap을 초기화하고 targets을 처리하는 것이 동일하기 때문에

크게 시간복잡도면에서 차이가 없었다.

 

댓글