역 폴란드어 표기법으로 산술식을 나타내는 아래와 같은 문자열 토큰 배열이 주어진다.
tokens = ["2","1","+","3","*"]
입력
tokens
출력
숫자와 연산자가 일반 계산식처럼 숫자와 연산자가 계산 순서대로 섞여 있는 게 아니라, 숫자 따로, 연산자 따로 있기 때문에, 숫자만 모아야 한다고 생각했다.
숫자를 모으고, 그 후에 연산자를 만나면, 제일 최근 숫자를 사용해야 했기 때문에, 바로 stack을 생각했다.
아래의 두 가지 생각으로 구현했다
class Solution {
public int evalRPN(String[] tokens) {
Stack<Integer> stack = new Stack<>();
// 숫자 스택 사용
for (String token: tokens) {
if (token.matches("[-+]?\\d*\\.?\\d+")) {
stack.push(Integer.parseInt(token));
continue;
}
int first = stack.pop();
int second = stack.pop();
switch(token) {
case "+":
stack.push(first+second);
break;
case "-":
stack.push(second-first);
break;
case "*":
stack.push(first*second);
break;
case "/":
stack.push(second/first);
break;
}
}
return stack.peek();
}
}
하지만 너무 느리고, 너무 공간을 많이 사용했다.
class Solution {
public int evalRPN(String[] tokens) {
Stack<Integer> st2 = new Stack<>();
for(String s : tokens){
if(s.equals("+") || s.equals("*") || s.equals("/") || s.equals("-")){
int b = st2.pop();
int a = st2.pop();
int res = cal(a, b, s.charAt(0));
st2.push(res);
} else {
st2.push(Integer.parseInt(s));
}
}
return st2.pop();
}
private int cal(int a, int b, char oprtr){
if(oprtr == '+'){
return a + b;
} else if(oprtr == '-'){
return a - b;
} else if(oprtr == '*'){
return a * b;
} else {
return a / b;
}
}
}
나의 코드와 로직상 다른 점이 없는 것 같지만, 아래와 같은 점이 달랐다.
아마 정규식을 이용한 matches 함수 사용에 시간이 느려졌던 것 같다. 내장 함수를 사용하는 것보다, 다르게 직접 구현할 방법이 있는지부터 생각하는 게 옳았다.