문제 : 후위식 연산식이 주어지면 연산결과를 출력해아
접근방식
- 후위연산식이 무엇인가? 연산자가 뒤에 있는 식
ex) 연산식 3(5+2)-9 => 후위연산식으로 표현하면 352+9- 이다.
=> 반대로 후위연산식을 연산식으로 변환하여 계산하면된다.
- stack 자료구조 방식으로 기본 연산식으로 변환할 수 있다.
=> 숫자요소는 stack[ ]에 모두 담고, 연산자를 만날경우 stack에 담긴 수를 빼내어 해당 연산자로 계산하는 것
ex) 352+*9- [3,5,2] 담다가 +만나면? 5와 2를 빼서 5 + 2 연산식으로 변경! 계산가능하다.
=> 연산자 중 -, % 때문에 계산할때 연산자 앞뒤의 숫자 순서가 중요한다. 5-2와 2-5는 다르다는 점!
풀이
- 계산할 숫자를 담고 뺄 stack 변수를 선언, [] 빈배열을 할당한다.
- for문) 모든 str 주어진 수와 연산자를 순서대로 조회한다.
- if 조건 1) 조회한 요소가 숫자인 경우? => !isNaN(str[i])
=> stack.push(Number(str[i])로 stack에 수를 반복적으로 담아준다.
=> 이때 문자열 숫자를 Number메소드로 수로 변경해준다.
- else 조건 2) 조회한 요소가 연산자인 경우?
=> stack의 맨 위 숫자를, rt = stack.pop() 변수에 담기
=> stack의 그 다음 숫자를 연산자 왼쪽에, lt = stack.pop()
=> rt를 연산자 오른쪽에 lt 를 연산자 왼쪽에 두고 계산한다.
(이 순서가 중요 ! - , / 할때는 수 위치에 따라 값이 완전 달라진다.)
- else 내 if 조건) +, -, /, * 연산자일 경우?
5-1. stack.push(계산하는 식) => stack []에 계산한 값을 담아준다.
=> 연산자를 만나면 계산한 값에 해당 연산자로 계산하는 식 반복
ex) [3,5,2], "+" => [3], stack.push(lt(5)+rt(2))
- 연산된 모든 값이 담긴 배열의 0번쨰 요소를 리턴한다. stack[0]
function solution(str) {
let stack = [];
for (let i = 0; i < str.length; i++) {
if (!isNaN(str[i])) {
stack.push(Number(str[i]));
} else {
let rt = stack.pop();
let lt = stack.pop();
if (str[i] === "+") stack.push(lt + rt);
else if (str[i] === "-") stack.push(lt - rt);
else if (str[i] === "*") stack.push(lt * rt);
else if (str[i] === "/") stack.push(lt / rt);
}
}
return stack[0];
}
let str = "352+*9-";
console.log(solution(str));