티스토리 뷰
1223. [S/W 문제해결 기본] 6일차 - 계산기2
import java.io.*;
import java.util.*;
// 210205
public class Solution_D4_1223_계산기2 {
static int N;
static String toPostfix(String inputStr) {
StringBuilder sb = new StringBuilder();
Stack<Character> opStack = new Stack<Character>();
for (int i = 0; i < N; i++) {
char cur = inputStr.charAt(i);
if (cur == '+' || cur == '-') {
// + -는, 앞에 오는 모든 연산자보다 우선 순위가 낮다.
// 따라서 스택이 빌 때 까지 먼저 왔던 연산자를 빼준다.
while (!opStack.isEmpty()) {
sb.append(opStack.pop());
}
opStack.push(cur);
} else if (cur == '*' || cur == '/') {
// * / 는, 앞에 오는 * / 연산자보다 우선 순위가 낮다.
if (! opStack.isEmpty()) {
while(true) {
if (opStack.isEmpty() ||
opStack.peek()=='+' || opStack.peek() == '-') {
break;
}
sb.append(opStack.pop());
}
}
opStack.push(cur);
} else {
// 숫자는 그냥 출력한다.
sb.append(cur);
}
}
// 스택에서 나오지 않은 연산자를 빼준다.
while (! opStack.isEmpty()) sb.append(opStack.pop());
return sb.toString();
}
static int calPostfix(String postNums) {
Stack<Integer> numStack= new Stack<Integer>();
for (int i=0; i<N; i++) {
char cur = postNums.charAt(i);
if ((cur-'0')>=0 && (cur-'0')<10) {
numStack.push(cur-'0');
} else {
int a = numStack.pop();
int b = numStack.pop();
switch (cur) {
case '*' : numStack.push(a*b); break;
case '/' : numStack.push(a/b); break;
case '+' : numStack.push(a+b); break;
case '-' : numStack.push(a-b); break;
}
}
}
return numStack.pop();
}
public static void main(String[] args) throws Exception {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
for (int tc=1; tc<=10; tc++) {
N = Integer.parseInt(br.readLine());
String inputStr = br.readLine();
System.out.println("#" + tc + " " + calPostfix(toPostfix(inputStr)));
}
} // main
}
'코딩테스트 > SW Expert' 카테고리의 다른 글
[SWEA] 1940. 가랏! RC카! (0) | 2021.02.08 |
---|---|
[SWEA] 1234. [S/W 문제해결 기본] 10일차 - 비밀번호 (0) | 2021.02.06 |
[SWEA] 1861. 정사각형 방 (0) | 2021.02.05 |
[SWEA] 3499. 퍼펙트 셔플 (0) | 2021.02.05 |
[SWEA] 5432. 쇠막대기 자르기 (0) | 2021.02.04 |
댓글