[Leet Code] Evaluate Reverse Polish Notation

기면지·2021년 5월 25일
0

LeetCode

목록 보기
13/20
post-thumbnail

안녕하세요 !
토요일부터 일요일까지 동아리 해커톤을 진행해서 이제야 포스팅으로 찾아왔습니다.
오늘은 4주차 4번째 알고리즘인 Evaluate Reverse Polish Notation 풀이를 작성해보겠습니다.


문제


요약
주어진 tokens 를 후위 연산한 값을 return하는 문제입니다.

처음 생각한 방법

진짜 처음 든 방법은 스택을 활용한 방법이었습니다.
너무나 스택을 쓰기 좋게 낸 문제라고 생각이 들었고 바로 문제를 풀어서 Accept를 받은 문제입니다.

그럼 짧고 간단하지만 아래에 풀이 작성해보겠습니다.

코드 설명

Stack<Integer> calculation = new Stack<>();

연산할 Stack 을 하나 선언합니다.

for (String token: tokens) {
    if (token.equals("+")) {
        int a = calculation.pop();
        int b = calculation.pop();
        calculation.push(b + a);
    } else if (token.equals("-")) {
        int a = calculation.pop();
        int b = calculation.pop();
        calculation.push(b - a);
    } else if (token.equals("*")) {
        int a = calculation.pop();
        int b = calculation.pop();
        calculation.push(b * a);
    } else if (token.equals("/")) {
        int a = calculation.pop();
        int b = calculation.pop();
        calculation.push(b / a);
    } else {
        calculation.push(Integer.parseInt(token));
    }
}

그 후에 입력받은 tokens 를 for문으로 순회하면서 해당 token 이 연산자이면 스택에 들어있는 상위 두 값을 연산하고, 연산자가 아니라면 숫자로 형변환 후에 스택에 저장합니다.
순서가 중요한데, 두번째로 pop 한 숫자가 앞에 연산하게 되어야 후위 연산이 제대로 진행됩니다.

전체 코드

class Solution {
    public int evalRPN(String[] tokens) {
        Stack<Integer> calculation = new Stack<>();

        for (String token: tokens) {
            if (token.equals("+")) {
                int a = calculation.pop();
                int b = calculation.pop();
                calculation.push(b + a);
            } else if (token.equals("-")) {
                int a = calculation.pop();
                int b = calculation.pop();
                calculation.push(b - a);
            } else if (token.equals("*")) {
                int a = calculation.pop();
                int b = calculation.pop();
                calculation.push(b * a);
            } else if (token.equals("/")) {
                int a = calculation.pop();
                int b = calculation.pop();
                calculation.push(b / a);
            } else {
                calculation.push(Integer.parseInt(token));
            }
        }

        return calculation.pop();
    }
}

마무리

해커톤을 잘 마무리하고 몸이 급격하게 안좋아져서 잠깐 뜸했었네요..
해커톤 후기도 남겨볼까 고민중인데, 그걸 포스팅하는게 맞나 싶기도 하고요 ㅎ.ㅎ
아무튼 이번 포스팅도 읽어주셔서 감사합니다 :)

profile
𝙎𝙈𝘼𝙇𝙇 𝙎𝙏𝙀𝙋𝙎 𝙀𝙑𝙀𝙍𝙔 𝘿𝘼𝙔

0개의 댓글