해당 문제는 후위연산식이 string 배열으로 주어졌을 때 stack을 사용하여 해결할 수 있다.
1. 주어진 string 배열으 데이터를 순차적으로 stack에 숫자들을 저장한다.
2. 연산기호를 만나면 직전에 넣은 두 숫자의 연산을 진행한 후 결과를 stack에 저장한다.
3. 연산이 끝나면 stack에 저장된 연산결과를 반환한다.
문제에서 입력이 들어오는 데이터는 String s 하나지만 위치 관리를 위해 필요한 변수를 미리 선언해야합니다.
stack
a
, b
// 기본 stack보다 더 효율적인 ArrayDeque를 사용
Deque<Integer> stack = new ArrayDeque<>();
int a;
int b;
후위 연산식이란 연산기호가 앞에 있을 수록 우선 연산을 진행한다.
따라서 입력 받은 배열은 탐색하다가 연산 기호를 만난다면, 해당 연산이 가장 우선 순위라고 판단하여 먼저 연산을 진행하고 해당 연산 결과를 stack에 다시 저장한다.
남은 연산을 동일한 방법으로 진행하면 결과를 얻을 수 있다.
switch(tokens[i]){
case "+":
a = stack.pop();
b = stack.pop();
stack.push(b+a);
break;
case "-":
a = stack.pop();
b = stack.pop();
stack.push(b-a);
break;
case "*":
a = stack.pop();
b = stack.pop();
stack.push(b*a);
break;
case "/":
a = stack.pop();
b = stack.pop();
stack.push(b/a);
break;
default:
stack.push(Integer.valueOf(tokens[i]));
break;
}
class Solution {
public int evalRPN(String[] tokens) {
Deque<Integer> stack = new ArrayDeque<>();
int a;
int b;
for(int i=0; i<tokens.length; i++){
switch(tokens[i]){
case "+":
a = stack.pop();
b = stack.pop();
stack.push(b+a);
break;
case "-":
a = stack.pop();
b = stack.pop();
stack.push(b-a);
break;
case "*":
a = stack.pop();
b = stack.pop();
stack.push(b*a);
break;
case "/":
a = stack.pop();
b = stack.pop();
stack.push(b/a);
break;
default:
stack.push(Integer.valueOf(tokens[i]));
break;
}
}
return (int) stack.pop();
}
}
시간 복잡도
공간 복잡도
다음과 같은 점수를 기록했다.
기본 후위 표기식은 stack으로 쉽게 구현할 수 있으며 우선순위를 처리하기 쉽기 때문에 계산기 프로그램을 만드는 과정에서 사용될 수 있다.