
문자열 계산식을 입력받는 계산기를 만드려고 합니다. 계산식은 덧셈, 뺄셈, 숫자로만 이루어져 있습니다. 계산식 s가 주어질 때, 계산식의 계산 결과를 출력하는 프로그램을 구현하세요.
입출력 예
| s | answer |
|---|---|
-3+26-7 | 16 |
4-5+10 | 9 |
stack을 이용하여 덧셈과 뺄셈 기호를 기준으로 문자열을 자릅니다. 우선 문자열 s를 각 문자별로 배열로 만들고, stack 과 answer, currN을 선언합니다.
배열 s를 순회하면서 currN에 현재 요소들을 더할 건데, 만약 + 나 -면서 currN이 하나라도 차 있다면 stack에 현재까지 쌓인 요소를 더하고 currN를 비웁니다. 그 뒤 다시 currN에 현재요소부터 쌓아줍니다.
배열을 한 번 돌았다면 마지막 숫자가 남게 되므로 (-7) 마지막까지 stack에 넣어주고, stack이 빌 때까지 앞에서부터 answer에 더하면서 넣어줍니다. 이때 stack의 요소들은 문자열이므로 숫자화하여 더해줍니다.
function solution(s) {
let stack = [];
let answer = 0;
let currN = '';
[...s].forEach(e => {
if ((e === '+' || e === '-') && currN != ''){
stack.push(currN);
currN = '';
}
currN += e;
})
if (currN !== ''){
stack.push(currN);
}
while (stack.length > 0){
answer += parseFloat(stack.shift());
}
return answer;
}
식 -3+26-7 가 있을 때를 가정해봅시다.
currN이 비어있으므로 조건 충족 x, currN에 저장currN에 저장currN(-3)을 stack에 저장, currN을 비운 후 currN에 저장currN에 저장currN(+26)을 stack에 저장, currN을 비운 후 currN에 저장currN에 저장배열을 다 돌았는데도 currN에 -7이 남아있으므로 마저 stack에 넣어줍니다.
현재까지 stack = ['-3', +26', '-7']
따라서 모두 숫자로 바꿔준 후 처음부터 더해줍니다.