SW Expert Academy - 1223번(계산기2)

최지홍·2022년 2월 12일
0

SW Expert Academy

목록 보기
13/36

문제 출처: https://swexpertacademy.com/main/code/problem/problemDetail.do?contestProbId=AV14nnAaAFACFAYD&categoryId=AV14nnAaAFACFAYD&categoryType=CODE&problemTitle=1223&orderBy=FIRST_REG_DATETIME&selectCodeLang=ALL&select-1=&pageSize=10&pageIndex=1


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

public class Solution {

    public static void main(String[] args) throws IOException {
        StringBuilder stringBuilder = new StringBuilder();
        BufferedReader reader = new BufferedReader(new InputStreamReader(System.in));

        int problemNum = 1;

        for (int i = 0; i < 10; i++) {
            StringBuilder sb = new StringBuilder();
            int size = Integer.parseInt(reader.readLine());
            char[] temp = reader.readLine().toCharArray();
            Stack<Character> stack = new Stack<>();
            char operator = ' ';

            // 중위 표기법 -> 후위 표기법
            for (int j = 0; j < size; j++) {
                // + -> 43번, * -> 42번
                if (temp[j] == '+' || temp[j] == '*') {
                    if (!stack.isEmpty()) {
                        char prev = stack.peek();
                        if (prev == temp[j]) { // 같을 경우
                            sb.append(stack.pop());
                        } else if (prev < temp[j]) { // 이전이 '*', 새로 들어온게 '+'인 경우
                            while (!stack.isEmpty()) {
                                sb.append(stack.pop());
                            }
                        }
                    }
                    stack.push(temp[j]);
                } else {
                    sb.append(temp[j]);
                }
            }

            while (!stack.isEmpty()) {
                sb.append(stack.pop());
            }

            // 후위 표기법 계산
            Stack<Integer> calcStack = new Stack<>();
            for (char c : sb.toString().toCharArray()) {
                if (c == '+' || c == '*') {
                    int head = ' ';
                    int tail = ' ';
                    int result = 0;
                    if (!calcStack.isEmpty()) tail = calcStack.pop();
                    if (!calcStack.isEmpty()) head = calcStack.pop();

                    if (c == '+') result = head + tail;
                    else result = head * tail;

                    calcStack.push(result);
                } else {
                    calcStack.push(c - '0');
                }
            }

            stringBuilder.append("#").append(problemNum++).append(" ");
            stringBuilder.append(calcStack.pop()).append("\n");
        }
        System.out.println(stringBuilder);
    }

}

  • 문제 접근법이 도저히 생각나지 않아 다른 분들의 로직을 참고하였다.
  • 주된 방법은 스택을 사용하는 것이다.

profile
백엔드 개발자가 되자!

0개의 댓글