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

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

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

 

[SW Expert Academy] 계산기1

 

SW Expert Academy

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

swexpertacademy.com

 

오랜만에 쓰는 코테런 해설이다. 3달 전의 코테런 해설을 쓰려니까 좀 헷갈리지만 오히려 덕분에 안 것이 많은 상태로 해설을 적을 수 있게 되었다. 일단 이 계산기는 기본적으로 후위 표기식을 사용한다. 이 후위 표기식은 정보처리기사 등의 자격증 시험에서도 나오는 것으로, 스택과 트리를 알면 매우 편해진다. 아느냐 모르냐에 따라서 지금 올리는 계산기1과 앞으로 올릴 계산기 문제들의 난이도가 달라질 것이다. 풀 당시에는 관련 지식이 없었지만, 지금은 쉽게 이해하고 풀 수 있게 되었다.

 

일단 이 계산기1은 매우 쉬운 문제다. 일단 정답이 굳이 따지면 그냥 더하기만 그대로 하면 된다. 코멘트에서의 원성도 자자한데, 이 계산기1의 의의는 후위로 바꾸는 법을 알고 있느냐에 대한 이야기이므로, 실제로 답보다는 풀이 과정이 중요하다고 할 수 있다.

 

이 후위 방식은 스택(Stack)의 성질을 알면 간단하다. 먼저 다음과 같이 후위 표기식을 만들었다.

 

StringBuilder num = new StringBuilder();
for(char c : br.readLine().toCharArray()){
    if(c != '+'){
        num.append(c);
        if (num.length() >= 2) num.append('+');
    }
}

 

+ 기호를 건너뛰고 숫자를 num에 추가, 그리고 num의 length가 2 이상이 되면 +를 추가한다. 이런식으로 StringBuilder를 통하여 후위 표기식을 만들었다. 그리고 Deque를 만들었다. Deque는 양방향 큐로서, Stack의  LIFO형태와 Queue의 FIFO 형태 모두를 사용할 수 있다. 이렇게 Deque를 사용하여 후위 표기법을 풀어나가면 된다. 그 방식은 다음과 같다.

 

Deque<Integer> stack = new ArrayDeque<>();
for(char c : num.toString().toCharArray()){
    if(c == '+'){
        stack.push(stack.pop() + stack.pop());
    } else {
        stack.push(c - '0'); // 문자를 숫자로 변환하여 push
    }
}

 

c가 +(연산자)가 아닐 경우, 숫자이므로   stack.push(c - '0')을 이용하여 해당 계산식에서 정수화시켜 push처리하여 저장한다. c가 +(연산자)일 경우,  stack.pop() + stack.pop()을 통하여 앞서 넣어둔 두 개의 stack의 값들을 pop()으로 빼내어 더하고, 저장한다. 이를 계속해서 반복하여 계산 합을 내면 된다.

 

 

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

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());

            StringBuilder num = new StringBuilder();
            for(char c : br.readLine().toCharArray()){
                if(c != '+'){
                    num.append(c);
                    if (num.length() >= 2) num.append('+');
                }
            }

            Deque<Integer> stack = new ArrayDeque<>();
            for(char c : num.toString().toCharArray()){
                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