본문 바로가기
카테고리 없음

[leetCode 150] Evaluate Reverse Polish Notaion (Java)

by ddahu 2023. 8. 30.

1.문제

LeetCode - The World's Leading Online Programming Learning Platform


2.문제설명

 

이 문제는 후위표기를 계산 하게 하는 문제이다. 

 


3.소스코드

public class Solution {
    public int evalRPN(String[] tokens) {
        Stack<Integer> stack = new Stack<>();
        String op = "+-*/";
        for (String token : tokens) {
            if (op.contains(token)) {
                int b = stack.pop();
                int a = stack.pop();
                int result = performOperation(a, b, token);
                stack.push(result);
            } else {
                stack.push(Integer.parseInt(token));
            }
        }

        return stack.pop();
    }

    private int performOperation(int a, int b, String operator) {
        switch (operator) {
            case "+":
                return a + b;
            case "-":
                return a - b;
            case "*":
                return a * b;
            case "/":
                return a / b;
        }
        return 0;
    }
}

4.소스코드해설

후위 연산 표기를 하기 위해서는 "+ - * / " 를 구별하고 stack 에 쌓아가면서 들어온 연산자를 통해 계산을 해주는 방식이 필요하다. 

들어온 문자열을 순회 하면서 들어온 문자열이 연산자이면 순회하면서 쌓아 두었던 stack 두개를 꺼내어 연산을 해준뒤 다시 push 후 순회하면 된다.

 


5.회고

 

첫 번째 시도

 

첫 번째 시도는 주먹구구식으로 조건을 따져서 stack에 push / pop 하면서 계산 하는 식으로 구현 하였다. 하지만 속도 측면에서는 나름 평균수준을 보였지만 메모리 측면에서는 나쁜 모습을 보여주어 개선을 시도해 보았다.

 

두번 째 시도는 연산자를 분리하는 if-else 문을 줄이는 메서드를 구현 하여 분리하는것이였다.

하지만.. 속도는 느려지고 메모리상태는 그대로이다.. 애초에 메서드로 분리해봤자 비슷한 결과를 가져올것 이라는 생각이 들어 if-else 에 계산하는 연산자를 거치는 if -else (or ) 문을 줄여 보는 시도를 해보았다.

 

세번쨰 시도

 

세번째 시도는 성공 적이였다. String op 라는 계산 연산자를 두어 if 조건에 을 줄여주고 계산 하는 방식이 메모리와 속도 측면에서 더 좋다는 것을 확인하게 되었다.