JavaScript에서는 문자열 형태로 주어진 수학 표현식을 실제로 계산해야 하는 경우가 종종 있습니다. 예를 들어 사용자 입력이나 외부 데이터에서 받아온 '1+23+4+5-30' 같은 문자열을 그대로 두면 단순한 텍스트일 뿐이지만, 이를 파싱하여 숫자 결과를 얻어야 할 때가 있습니다.
문제 정의
문자열로 된 수학식을 인수로 받아, 해당 식의 계산 결과를 반환하는 함수를 작성해 보겠습니다.
예를 들어 다음과 같은 문자열이 입력으로 주어졌다면 −
const str = '1+23+4+5-30';
출력값은 다음과 같아야 합니다.
3
접근 방법
핵심 아이디어는 정규표현식(RegExp)을 활용해 문자열에서 부호(+ 또는 −)와 숫자 조각들을 추출한 뒤, 각 조각을 순서대로 더하는 것입니다. 이 방식은 덧셈과 뺄셈으로만 이루어진 표현식을 안전하게 처리할 수 있으며, eval()처럼 임의의 코드를 실행하지 않으므로 보안상으로도 훨씬 안전합니다.
예제 코드
const str = '1+23+4+5-30';
const compute = (str = '') => {
let total = 0;
// 부호와 숫자 패턴을 배열로 추출
str = str.match(/[+\-]*(\.\d+|\d+(\.\d+)?)/g) || [];
while (str.length) {
total += parseFloat(str.shift());
}
return total;
};
console.log(compute(str));코드 설명
- 정규표현식 매칭:
/[+\-]*(\.\d+|\d+(\.\d+)?)/g패턴은 앞에 붙은 부호(+ 또는 −)와 함께 소수 또는 정수를 하나의 그룹으로 묶어 추출합니다. 덕분에-30은 음수 하나로,+23은 양수 하나로 인식됩니다. - 누적 합계:
while루프에서shift()로 배열의 앞 요소를 하나씩 꺼내고,parseFloat()으로 문자열을 숫자로 변환한 뒤total에 더합니다. - 안전장치: 매칭 결과가 없을 경우
|| []로 빈 배열을 반환해 오류 없이 0을 반환하도록 처리했습니다.
출력 결과
콘솔에는 다음과 같이 출력됩니다.
3
주의 사항
이 방법은 덧셈과 뺄셈만 포함된 표현식에 적합합니다. 곱셈이나 나눗셈, 괄호가 포함된 복잡한 수식을 처리하려면 연산자 우선순위를 고려한 파서를 직접 구현하거나, 검증된 수식 파싱 라이브러리(math.js 등)를 사용하는 것이 좋습니다. 절대로 신뢰할 수 없는 입력에 eval()을 사용해서는 안 됩니다. 악성 코드 실행으로 이어질 수 있기 때문입니다.