문자열을 유일한 인자로 받아서, 그에 해당하는 숫자를 반환하는 함수를 작성해야 합니다.
예를 들면 다음과 같습니다.
one five seven eight -------> 1578
Two eight eight eight -------> 2888
이 문제는 생각보다 간단합니다. 핵심 아이디어는 다음과 같습니다.
해결 접근 방식
먼저 입력 문자열을 공백을 기준으로 분리하여 단어 배열을 만듭니다. 그다음 각 단어가 'zero'부터 'nine'까지의 어느 숫자 단어에 해당하는지 찾아내고, 해당 숫자를 결과값에 차례대로 더해 나갑니다.
각 자릿수를 이어 붙이기 위해 누적값에 10을 곱한 뒤 현재 숫자를 더하는 방식을 사용하면, 단어들이 하나의 정수로 자연스럽게 연결됩니다.
구현 코드
const wordToNum = (str) => {
const legend = ['zero', 'one', 'two', 'three', 'four', 'five', 'six', 'seven', 'eight', 'nine'];
return str.toLowerCase().split(" ").reduce((acc, val) => {
const index = legend.indexOf(val);
return (acc*10 + index);
}, 0);
};
console.log(wordToNum('one five six eight'));
console.log(wordToNum('zero zero two zero eight'));
console.log(wordToNum('eight six seven five'));코드 설명
- legend 배열: 'zero'부터 'nine'까지의 영어 단어를 인덱스 순서대로 저장합니다. 즉, 단어의 인덱스가 곧 그 단어가 의미하는 숫자입니다.
- toLowerCase(): 입력 문자열을 모두 소문자로 변환하여 'Two'처럼 대문자가 포함된 입력도 올바르게 처리할 수 있도록 합니다.
- split(" "): 공백을 기준으로 문자열을 잘라 단어 배열을 생성합니다.
- reduce(): 초기값 0에서 시작해 각 단어마다 누적값에 10을 곱하고 해당 숫자를 더함으로써 자릿수를 왼쪽부터 차례로 채워 나갑니다.
실행 결과
콘솔에 출력되는 결과는 다음과 같습니다.
1568
208
8675
'zero zero two zero eight'의 경우 앞의 0들은 최종 정수에서 무시되어 208이 출력됩니다. 이는 JavaScript에서 숫자 표현 시 선행 0이 유지되지 않기 때문으로, 정상적인 동작입니다.