SWEA 1222 계산기1
문제 정보
- 문제 출처 : SW Expert Academy
- 문제 번호 : 1222
- 문제 제목 : 계산기1
- 문제 난이도 : D4
- 풀이 언어 : Java
문제
문자열로 이루어진 계산식이 주어질 때, 이 계산식을 후위 표기식으로 바꾸어 계산하는 문제
접근
Stack 을 활용해 문제를 풀었다.
풀이
- Scanner 를 이용해 테스트 케이스의 길이와 문자열을 입력 받습니다.
- 입력 받은 중위 표기식을 저장할 String exp 변수를 선언합니다.
- 연산자를 저장할 Stack<Character>와 계산 결과를 저장할 Stack<Integer>를 각각 선언합니다.
- 후위 표기식을 저장할 StringBuilder postExp 를 선언합니다.
- exp의 각 문자를 순회하면서, 숫자라면 postExp 에 추가하고, 연산자라면 스택이 비어있지 않은 동안 스택의 내용을 postExp에 추가한 다음, 현재 연산자를 스택에 push합니다.
- 순회가 끝난 후 스택에 남은 연산자를 postExp에 추가합니다.
- postExp의 각 문자를 순회하면서, 숫자라면 스택에 push하고, 연산자라면 스택에서 두 숫자를 pop하여 계산한 후 그 결과를 스택에 다시 push합니다.
- 마지막으로 스택에 남은 값을 출력합니다.
후기
헷갈렸던 문제이다. 스택을 더 많이 활용해봐야겠다.
코드
Java
import java.util.Scanner;
import java.io.FileInputStream;
import java.util.Stack;
class Solution
{
public static void main(String args[]) throws Exception
{
Scanner sc = new Scanner(System.in);
for(int test_case = 1; test_case <= 10; test_case++)
{
int len = sc.nextInt();
String exp = sc.next();
Stack<Character> stack = new Stack<>();
StringBuilder postfix = new StringBuilder();
for (int i = 0; i < exp.length(); i++) {
char c = exp.charAt(i);
if (Character.isDigit(c)) {
postfix.append(c);
} else {
while (!stack.isEmpty()) {
postfix.append(stack.pop());
}
stack.push(c);
}
}
while (!stack.isEmpty()) {
postfix.append(stack.pop());
}
Stack<Integer> numStack = new Stack<>();
for (int i = 0; i < postfix.length(); i++) {
char c = postfix.charAt(i);
if (Character.isDigit(c)) {
numStack.push(c - '0');
} else {
int b = numStack.pop();
int a = numStack.pop();
numStack.push(a + b);
}
}
System.out.println("#" + test_case + " " + numStack.pop());
}
}
}
Java