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

JavaScript에서 숫자 문자열을 알파벳으로 변환하는 방법

임의의 길이를 가진 숫자 문자열을 입력받아, 이를 대응되는 알파벳 문자열로 변환하는 JavaScript 함수를 작성해 보겠습니다.

변환 규칙은 간단합니다. 숫자 1부터 26까지가 각각 알파벳 소문자 a부터 z까지와 일대일로 대응됩니다. 즉, 1은 'a', 2는 'b', …, 26은 'z'입니다. 여기서 주의할 점은 한 자리 숫자뿐만 아니라 두 자리 숫자(10~26) 역시 하나의 알파벳으로 변환될 수 있다는 것입니다.

동작 예시

예를 들어 숫자 문자열이 다음과 같다면,

const str = '78956';

출력 결과는 다음과 같습니다.

const output = 'ghief';

반면 숫자 문자열이 다음과 같다면,

const str = '12345';

출력 문자열은 다음과 같습니다.

const output = 'lcde';

'12345'의 경우 1과 2를 각각 'a'와 'b'로 따로 변환하지 않고, 두 숫자를 이어 붙인 12를 하나의 알파벳 'l'로 변환했습니다. 12 역시 유효한 알파벳 범위(1~26)에 속하기 때문입니다. 따라서 함수를 작성할 때 반드시 이 경우를 고려해야 합니다.

한편 '78956'에서는 인접한 두 숫자를 이어 붙여도 78, 89, 95, 56처럼 모두 26을 초과하므로, 각 숫자가 개별적으로 변환됩니다.

여기서는 숫자 문자열에 0이 포함되지 않는다고 가정합니다. 만약 0이 포함된다면 0은 자기 자신 그대로 매핑됩니다.

구현 코드

이제 위 로직을 구현한 코드를 살펴보겠습니다.

const str = '12345';
const str2 = '78956';
const convertToAlpha = numStr => {
   const legend = '0abcdefghijklmnopqrstuvwxyz';
   let alpha = '';
   for(let i = 0; i < numStr.length; i++){
      const el = numStr[i], next = numStr[i + 1];
      if(+(el + next) <= 26){
         alpha += legend[+(el + next)];
         i++;
      }
      else{
         alpha += legend[+el];
      };
   };
   return alpha;
};
console.log(convertToAlpha(str));
console.log(convertToAlpha(str2));

실행 결과

콘솔에 출력되는 결과는 다음과 같습니다.

lcde
ghief

코드 동작 원리

  • 참조 문자열(legend): '0abcdefghijklmnopqrstuvwxyz' 형태의 문자열을 준비해 인덱스만으로 숫자를 알파벳으로 변환할 수 있게 합니다. 인덱스 0에는 더미 값 '0'이 들어 있어 실제 알파벳이 인덱스 1~26에 위치합니다.
  • 두 자리 숫자 우선 검사: 반복문 안에서 현재 숫자(el)와 바로 뒤의 숫자(next)를 이어 붙인 값이 26 이하인지 확인합니다. 26 이하라면 두 자리 숫자 전체를 하나의 알파벳으로 변환하고, 인덱스를 한 칸 더 이동(i++)시켜 두 자릿수를 한 번에 건너뜁니다.
  • 단일 숫자 처리: 두 자리 조합이 26을 초과하거나 문자열의 마지막 문자인 경우에는 현재 숫자 하나만 알파벳으로 변환합니다.

이처럼 탐욕적(greedy) 방식으로 앞에서부터 두 자리 숫자를 우선 검사하면, 별도의 재귀나 백트래킹 없이도 선형 시간 O(n)에 문자열 변환이 가능합니다.