Computer >> 컴퓨터 >  >> 프로그래밍 >> JavaScript

JavaScript에서 문자열에 해당하는 전화 키패드 숫자 찾는 방법

전화 키패드와 알파벳 매핑

구형 버튼식 휴대폰에서는 숫자 키마다 알파벳이 다음과 같이 배치되어 있었습니다.

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)) 동작하므로 효율적입니다. 또한 매핑 객체만 수정하면 다른 키패드 규칙에도 손쉽게 확장할 수 있다는 장점이 있습니다.