전화 키패드와 알파벳 매핑
구형 버튼식 휴대폰에서는 숫자 키마다 알파벳이 다음과 같이 배치되어 있었습니다.
const mapping = {
1: [],
2: ['a', 'b', 'c'],
3: ['d', 'e', 'f'],
4: ['g', 'h', 'i'],
5: ['j', 'k', 'l'],
6: ['m', 'n', 'o'],
7: ['p', 'q', 'r', 's'],
8: ['t', 'u', 'v'],
9: ['w', 'x', 'y', 'z']
};흔히 접하는 "숫자 조합으로 만들 수 있는 모든 단어 구하기" 문제와 반대로, 이번에는 알파벳으로 이루어진 문자열을 입력받아 그 문자열을 입력하기 위해 눌러야 하는 숫자 조합을 배열로 반환하는 JavaScript 함수를 작성해야 합니다.
예를 들어 입력 문자열이 다음과 같다면,
const str = 'mad';
출력 결과는 아래와 같아야 합니다.
const output = [6, 2, 3];
'm'은 6번, 'a'는 2번, 'd'는 3번 키에 해당하기 때문입니다.
구현 방법
핵심 아이디어는 간단합니다. 먼저 기존 매핑 객체를 뒤집어 "알파벳 → 숫자" 형태의 조회 테이블을 만든 뒤, 문자열의 각 글자를 순회하며 대응되는 숫자로 변환하면 됩니다.
const mapping = {
1: [],
2: ['a', 'b', 'c'],
3: ['d', 'e', 'f'],
4: ['g', 'h', 'i'],
5: ['j', 'k', 'l'],
6: ['m', 'n', 'o'],
7: ['p', 'q', 'r', 's'],
8: ['t', 'u', 'v'],
9: ['w', 'x', 'y', 'z']
};
const convertToNumeral = (str = '') => {
// 매핑 객체를 뒤집어 { 알파벳: 숫자 } 형태의 객체 생성
const entries = Object.entries(mapping);
const reverseMap = entries.reduce((acc, [num, letters]) => {
letters.forEach(letter => acc[letter] = +num);
return acc;
}, {});
// 각 문자를 대응하는 숫자로 변환
const result = Array.from(str, char => reverseMap[char]);
return result;
};
console.log(convertToNumeral('mad'));실행 결과
콘솔에는 다음과 같이 출력됩니다.
[ 6, 2, 3 ]
코드 설명
- Object.entries(mapping): 매핑 객체를 [키, 값] 쌍의 배열로 변환하여 순회할 수 있게 합니다.
- reduce(): 각 숫자에 속한 알파벳들을 모두 순회하며 "알파벳 → 숫자" 형태의 역방향 조회 객체를 한 번에 만듭니다.
- Array.from(str, ...): 문자열을 한 글자씩 순회하며 새 배열을 생성하고, 각 글자를 대응하는 숫자로 치환합니다.
이 방식은 문자열 길이에 비례해 선형적으로(O(n)) 동작하므로 효율적입니다. 또한 매핑 객체만 수정하면 다른 키패드 규칙에도 손쉽게 확장할 수 있다는 장점이 있습니다.