Algorithm/SWEA
[ SWEA ] 1223. 계산기 2 D4 JAVA
_cpdm_
2022. 9. 29. 17:25
반응형
문제
SW Expert Academy
SW 프로그래밍 역량 강화에 도움이 되는 다양한 학습 컨텐츠를 확인하세요!
swexpertacademy.com
아이디어
1. 중위 표현을 후위 표현으로 변환
2. 변환된 식으로 계산
코드
import java.io.*;
import java.util.Stack;
public class Solution {
// 우선순위 비교
static boolean topIsBigger(int top, int val) {
// + : 43 *:42 이므로 top이 크면 우선순위가 낮은 것
if(top>val) return false;
return true;
}
public static void main(String[] args) throws Exception {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
StringBuilder sb = new StringBuilder();
// 총 10개의 테케가 주어진다.
for (int tc = 1; tc <= 10; ++tc) {
int Length = Int(br.readLine());
char[] expression = br.readLine().toCharArray();
int index = 0;
Stack<Character> operator = new Stack<Character>();
Stack<Integer> number = new Stack<Integer>();
String after = "";
// 1. 후위식으로 변경한다.
while (index < Length) {
char tmp = expression[index++];
// 숫자면 바로 after에 더해준다.
if ('0' <= tmp && tmp <= '9') after += tmp;
else {// 스택이 비어있으면 바로 넣어준다.
if (operator.isEmpty()) operator.push(tmp);
else {// 탑이 새로들어가는 연산자보다 우선순위가 낮으면 바로 넣어준다.
if (!topIsBigger(operator.peek(), tmp)) operator.push(tmp);
else {// 탑의 우선순위가 새로 들어가는 것 보다 높다면
while (true) {
if (operator.isEmpty()) {
operator.push(tmp);
break;
}
if (!topIsBigger(operator.peek(), tmp)) {
operator.push(tmp);
break;
}
// 탑의 우선순위가 작아질 때 까지 빼주고, 결과에 더해준다.
after += operator.pop();
}
}
}
}
}
while(!operator.isEmpty()) after += operator.pop();//남은거 다뺴주고
// 2. 변경이 완료되면 식을 계산한다.
index = 0; // 시작
int a = 0, b = 0;
while (index < after.length()) {
char tmp = after.charAt(index++);
if('0'<=tmp && tmp <='9') number.push(Int(tmp));//숫자면 바로 넣어주고
else {// 문자면 pop
b = number.pop();
a = number.pop();
switch (tmp) {
case '*':
number.push(a * b);
break;
case '+':
number.push(a + b);
break;
}
}
}
sb.append("#" + tc + " ").append(number.pop()).append(" \n");
}
System.out.println(sb);
}
static int Int(String s) { return Integer.parseInt(s); }
static int Int(char c) { return c-'0'; }
}
cpdm
choppadontbiteme.tistory.com
반응형