[코딩 테스트 RUN] SWEA 수업 : 1223.계산기2

코테런/SWEA(알고리즘 수업)
2026.07.01
반응형

 

⚠️ 주의!
SWEA에서 낸 코딩 문제에 대한 해답이 들어있습니다.
열람 시 주의해주세요.

 

 

 

[SW Expert Academy] 1223. 계산기2

 

SW Expert Academy

SW 프로그래밍 역량 강화에 도움이 되는 다양한 학습 컨텐츠를 확인하세요!

swexpertacademy.com

 

계산기1에서 그다지 내용은 바뀌지 않는다. 따라서 원리 등을 파악하기 위해서는 다음 포스트를 참조.

 

[코딩 테스트 RUN] SWEA 수업 : 1222.계산기1

 

[코딩 테스트 RUN] SWEA 수업 : 1222.계산기1

⚠️ 주의!SWEA에서 낸 코딩 문제에 대한 해답이 들어있습니다.열람 시 주의해주세요. [SW Expert Academy] 계산기1 SW Expert AcademySW 프로그래밍 역량 강화에 도움이 되는 다양한 학습 컨텐츠를 확인하세

bbbbabbbababababa.tistory.com

 

다만 하나 연산자가 늘어났다. 제일 간단하게 처리하려면 if문과 else-if문으로 +외에 *도 케이스에 넣어 처리하면 된다. 다만 여기서 중요한 것은 +연산자와 * 연산자 사이에 우선순위가 생겼다는 것. 후위를 만들 때는 이에 유의해야한다. 우선순위가 높거나 같은 연산자들을 스택에서 빼내어 num에 append해야 하므로,  while(!op.isEmpty()) { num.append(op.pop()); }  과 같은 식이 추가되게 된다. 이에 따라서 이를 보조하기 위해 op라는 Deque를 추가했다. 그러므로 Deque가 두 개가 된다.

 

정답

import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.util.ArrayDeque;
import java.util.Deque;
import java.util.Stack;

public class Solution {
    public static void main(String[] args) throws Exception {
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        StringBuilder sb = new StringBuilder();
        int T = 10;

        for (int test_case = 1; test_case <= T; test_case++) {
            int N = Integer.parseInt(br.readLine());
            Deque<Character> op = new ArrayDeque<>();

            StringBuilder num = new StringBuilder();
            for(char c : br.readLine().toCharArray()){
                if(Character.isDigit(c)){
                    num.append(c);
                } else if(c == '*') {
                    op.push(c);
                } else if(c == '+') {
                    while(!op.isEmpty()) { num.append(op.pop()); }
                    op.push(c);
                }
            }

            while(!op.isEmpty()) { num.append(op.pop()); }

            Stack<Integer> stack = new Stack<>();
            for(char c : num.toString().toCharArray()){
                if(c == '*'){
                    stack.push(stack.pop() * stack.pop());
                }
                else if(c == '+') {
                    stack.push(stack.pop() + stack.pop());
                }
                    else {
                    stack.push(c - '0');
                }
            }

            sb.append("#").append(test_case).append(" ").append(stack.pop()).append("\n");

        } //테스트 케이스 종료

        System.out.print(sb.toString());
    }
}
반응형
«   2026/07   »
1 2 3 4
5 6 7 8 9 10 11
12 13 14 15 16 17 18
19 20 21 22 23 24 25
26 27 28 29 30 31