이 알고리즘 문제는 인프런의 자바(Java) 알고리즘 문제풀이 입문: 코딩테스트 대비 (김태원)의 문제입니다.


문제 설명

 

코드

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.Stack;

public class sec05_04 {
    public static int solution(String str) {
        Stack<Integer> stack = new Stack<>();
        for (Character c : str.toCharArray()) {
            if(Character.isDigit(c)) stack.push(Character.getNumericValue(c));
            else
            {
                int right = stack.pop();
                int left = stack.pop();
                if(c == '+') stack.push(left + right);
                else if(c == '-') stack.push(left - right);
                else if(c == '*') stack.push(left * right);
                else if(c == '/') stack.push(left / right);
            }
        }
        return stack.pop();
    }

    public static void main(String[] args) throws IOException {
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        System.out.println(solution(br.readLine()));
    }
}

 

설명

  • 문자열의 각 문자를 순차적으로 탐색한다.
  • 숫자인 경우: 해당 숫자를 스택에 푸시(push)한다.
  • 연산자인 경우: 스택에서 두 개의 숫자를 팝(pop)하여 꺼낸다.
    -첫 번째로 꺼낸 숫자를 right, 두 번째로 꺼낸 숫자를 left라고 한다.
    -꺼낸 두 숫자에 대해 연산자를 적용한 결과를 다시 스택에 푸시한다.
    예를 들어, c가 +라면 left + right를 스택에 푸시한다.