[SWEA 1223] [S/W 문제해결 기본] 6일차 - 계산기2
업데이트:
문제
- SWEA 1223번
- 문제의 저작권은 SW Expert Academy에 있습니다.
접근방식
코드
import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.OutputStreamWriter;
import java.util.Scanner;
import java.util.Stack;
public class Swea_1223 {
static BufferedReader br;
static BufferedWriter bw;
static int N;
static String input;
static StringBuilder postfix; // 후위표기식
static Stack<Character> operator; // 1. 연산자 스택
static Stack<Integer> cal; // 2. 계산 스택
static Scanner sc;
public static void main(String[] args) throws IOException {
br = new BufferedReader(new InputStreamReader(System.in));
bw = new BufferedWriter(new OutputStreamWriter(System.out));
for (int tc = 1; tc < 11; tc++) {
postfix = new StringBuilder();
operator = new Stack<>();
cal = new Stack<>();
input = "";
N = Integer.parseInt(br.readLine());
input = br.readLine();
// 후위표기식 만들기
for (int i = 0; i < input.length(); i++) {
char ch = input.charAt(i);
if (ch == '+' || ch == '*') { // 연산자 이면
// 비어있다면
if (operator.isEmpty())
operator.push(ch);
else { // 비어있지 않으면
char top = operator.peek();
if (ch == '+') { // 덧셈이라면
while (!operator.isEmpty()) {
postfix.append(operator.pop());
}
operator.push(ch);
} else if (ch == '*') { // 곱셈이라면
if (top == '*') { // top이 곱셈이면
postfix.append(operator.pop());
operator.push(ch);
} else {
operator.push(ch);
}
}
}
} else { // 연산자가 아니면
postfix.append(ch);
}
}
while (!operator.isEmpty()) {
postfix.append(operator.pop());
}
// 계산하기
for (int i = 0; i < postfix.length(); i++) {
char ch = postfix.charAt(i);
if (ch == '+' || ch == '*') { // 피연산자라면
int x = 0;
int y = 0;
int result = 0;
switch (ch) {
case ('+'):
x = cal.pop();
y = cal.pop();
result = x + y;
cal.push(result);
break;
case ('*'):
x = cal.pop();
y = cal.pop();
result = x * y;
cal.push(result);
break;
default:
break;
}
} else {// 숫자라면
cal.push(ch - '0');
}
}
bw.write("#"+tc+" "+cal.pop().toString()+"\n");
}
br.close();
bw.flush();
bw.close();
}
}