
SWEA에서 낸 코딩 문제에 대한 해답이 들어있습니다.
열람 시 주의해주세요.
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());
}
}
'코테런 > SWEA(알고리즘 수업)' 카테고리의 다른 글
| [코딩 테스트 RUN] SWEA 수업 : 1224.계산기3 (0) | 2026.07.02 |
|---|---|
| [코딩 테스트 RUN] SWEA 수업 : 1223.계산기2 (0) | 2026.07.01 |
| [코딩 테스트 RUN] SWEA 수업 : 19003. 팰린드롬 문제 (0) | 2026.03.10 |
| [코딩 테스트 RUN] SWEA 수업 : 1216. 회문2 (0) | 2026.03.10 |
| [코딩 테스트 RUN] SWEA 수업 : 1215. 회문1 (0) | 2026.03.10 |
