[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();

	}
}