150. Evaluate Reverse Polish Notation
Problem
Evaluate the value of an arithmetic expression in Reverse Polish Notation.
Valid operators are +, -, *, /. Each operand may be an integer or another expression.
Example
Input: ["4", "13", "5", "/", "+"]
Output: 6
Explanation: (4 + (13 / 5)) = 6
[1] Code (21. 02. 08)
class Solution {
public int evalRPN(String[] tokens) {
Stack<Integer> stack = new Stack<>();
for (int i = 0; i < tokens.length; i++) {
if (isDigit(tokens[i])) {
stack.push(getIntegerValue(tokens[i]));
} else if (tokens[i].equals("+")) {
stack.push(stack.pop() + stack.pop());
} else if (tokens[i].equals("-")) { // [3]
int first = stack.pop();
int second = stack.pop();
stack.push(second - first);
} else if (tokens[i].equals("*")) {
stack.push(stack.pop() * stack.pop());
} else if (tokens[i].equals("/")) { // [3]
int first = stack.pop();
int second = stack.pop();
int result = second / first;
stack.push(result);
}
}
return stack.pop();
}
private boolean isDigit(String s) {
return !(s.equals("+") || s.equals("-") || s.equals("*") || s.equals("/"));
}
// [1]
private Integer getIntegerValue(String s) {
// Integer 내장 메소드
// Integer.valueOf(s);
// 직접 구현
int isNegative = 1;
if (s.charAt(0) == '-') { // [2]
s = s.substring(1);
isNegative = -1;
}
int value = 0;
for (int i = 0; i < s.length(); i++) {
value = (value * 10) + (s.charAt(i) - '0');
}
return isNegative * value;
}
}
Check Point
-
1개의 String을 int 값으로 변환하는 방법
-
getIntegerValue( )에서 음수로 들어오는 경우
-
’-‘와 ‘/’일 경우 적용시키는 값의 순서
-
[1] : Integer의 내장 메소드 혹은 직접 구현해서 값을 구할 수 있다.
-
[2] : 음수일 경우 substring으로 음수 자리를 없애준다.
[2] Code (23. 04. 19)
Need to Retry
// Runtime: 23 ms
// Memory Usage: 44.8 MB
// Ref : https://leetcode.com/submissions/detail/936229652
class Solution {
public int evalRPN(String[] tokens) {
String regex = "\\d+";
Stack<String> st = new Stack<>();
for (String s : tokens) {
if (s.matches(regex)) {
st.add(s);
} else if (s.startsWith("-") && s.substring(1, s.length()).matches(regex)) {
st.add(s);
} else {
int val1 = Integer.parseInt(st.pop());
int val2 = Integer.parseInt(st.pop());
switch (s) {
case "+":
st.add(String.valueOf(val2 + val1));
break;
case "-":
st.add(String.valueOf(val2 - val1));
break;
case "*":
st.add(String.valueOf(val2 * val1));
break;
case "/":
st.add(String.valueOf(val2 / val1));
break;
default:
break;
}
}
}
return Integer.parseInt(st.pop());
}
}
Review
- 처음 풀었을 때보다는 코드가 간결해졌다.