문제 개요
수학 연산식이 담긴 문자열(예: '5 - 8')을 입력받아, 해당 식의 의미를 사람이 읽기 쉬운 영어 단어 형태인 "Five Minus Eight"로 반환하는 JavaScript 함수를 작성해야 합니다.
접근 방법
이 문제는 세 가지 단계로 나누어 해결할 수 있습니다.
첫째, 각 연산자 기호와 대응되는 영어 표현을 담은 객체를 만듭니다. 둘째, 숫자 1부터 10까지를 영어 단어로 매핑한 객체를 준비합니다. 셋째, 입력 문자열을 공백 기준으로 분리한 뒤 왼쪽 피연산자, 연산자, 오른쪽 피연산자 순서로 단어를 조합합니다.
연산자 매핑 목록
+→ Plus-→ Minus*→ Times/→ Divided By**→ To The Power Of=→ Equals!=→ Does Not Equal
구현 코드
const str = '5 - 8';
const convertToWords = (str = '') => {
const o = {
'+' : 'Plus',
'-' : 'Minus',
'*' : 'Times',
'/' : 'Divided By',
'**' : 'To The Power Of',
'=' : 'Equals',
'!=' : 'Does Not Equal',
}
const n = {
1 : 'One',
2 : 'Two',
3 : 'Three',
4 : 'Four',
5 : 'Five',
6 : 'Six',
7 : 'Seven',
8 : 'Eight',
9 : 'Nine',
10 : 'Ten',
}
let t = str.split(' ')
let y = ''
let c = 0
for (const [key, value] of Object.entries(o)) {
if(key !== t[1])
c++;
}
if(c === Object.keys(o).length) return "That's not an operator!"
for (const [key, value] of Object.entries(n)) {
if(key === t[0])
y += `${value} `
}
for (const [key, value] of Object.entries(o)) {
if(key === t[1])
y += `${value}`
}
for (const [key, value] of Object.entries(n)) {
if(key === t[2])
y += ` ${value}`
}
return y;
}
console.log(convertToWords(str));
코드 설명
객체 o에는 연산자 기호와 영어 표현이, 객체 n에는 숫자와 영어 단어가 각각 저장됩니다. 입력 문자열을 split(' ')으로 분리하면 t = ['5', '-', '8'] 배열이 만들어집니다.
첫 번째 반복문에서는 두 번째 요소 t[1]이 유효한 연산자인지 검사합니다. 어떤 연산자와도 일치하지 않으면 카운터 c가 전체 연산자 개수와 같아지고, 이 경우 "That's not an operator!"라는 안내 메시지를 반환합니다.
이후 세 개의 반복문을 통해 왼쪽 숫자, 연산자, 오른쪽 숫자를 차례대로 영어 단어로 치환하고, 이를 하나의 문자열로 조합하여 최종 결과를 반환합니다.
실행 결과
Five Minus Eight
정리
이 예제는 객체를 활용한 매핑과 Object.entries()를 이용한 반복 처리만으로도 문자열 파싱 문제를 간결하게 해결할 수 있음을 보여줍니다. 실무에서 확장한다면 음수, 소수, 두 자릿수 이상의 숫자까지 지원하도록 로직을 발전시킬 수 있습니다.