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

 

반응형