알고리즘
[Javascript] 프로그래머스 - 대충 만든 자판
J3SUNG
2025. 1. 4. 00:10
728x90
문제 설명
임의로 설계된 휴대폰 자판이 주어질 때, 특정 문자열을 작성하기 위해 키를 최소 몇 번 눌러야 하는지 계산하는 문제입니다.
- 각 키는 여러 문자를 포함하며, 특정 키를 연속으로 누를 때마다 다음 문자로 넘어갑니다.
- 작성할 수 없는 문자열이 있는 경우 결과는 -1로 표시합니다.
제한사항
- keymap 배열
- 1 ≤ keymap.length ≤ 100
- 1 ≤ keymap[i].length ≤ 100
- 각 원소는 알파벳 대문자로만 구성되며, 같은 문자가 중복될 수 있습니다.
- targets 배열
- 1 ≤ targets.length ≤ 100
- 1 ≤ targets[i].length ≤ 100
- 각 원소는 알파벳 대문자로만 구성됩니다.
해결 방법
알고리즘: 배열을 활용한 효율적 탐색
- 데이터 구조 초기화
각 알파벳의 최소 키 입력 횟수를 저장할 배열 alp를 생성합니다. - 자판 정보 처리
keymap을 순회하며 각 키에 할당된 문자의 최소 입력 횟수를 갱신합니다. - 목표 문자열 순회
targets를 순회하며 각 문자열에 대해 필요한 총 키 입력 횟수를 계산합니다.
작성할 수 없는 문자가 포함된 경우 -1을 결과로 추가합니다. - 결과 반환
각 목표 문자열의 키 입력 횟수를 배열로 반환합니다.
시간 복잡도
- 자판 배열 처리: O(m⋅k)
- 목표 문자열 처리: O(t⋅n)
- 총 시간 복잡도: O(m⋅k+t⋅n)
구현 코드
function solution(keymap, targets) {
let alp = new Array(26).fill(Infinity);
for (const keyArr of keymap) {
[...keyArr].forEach((key, index) => {
const pos = key.charCodeAt(0) - 65;
alp[pos] = Math.min(alp[pos], index + 1);
});
}
return targets.map((keyArr) => {
let total = 0;
for (key of keyArr) {
const pos = key.charCodeAt(0) - 65;
if (alp[pos] === Infinity) return -1;
total += alp[pos];
}
return total;
});
}