알고리즘 스터디 7월 5주차 문제3 (계산기2)

문제#

  • 링크로 대체

풀이 및 주저리..

D4 문제중 나름 쉬워보였던 계산기2 문제이다. 다른 로직으로도 충분히 해결할 수 있지만, 후위연산자로 바꾸는 형식과 후에 괄호나 나누기 뺄셈이 나올때까지를 고려해서 문제를 풀어보았다. 처음으로 문제를 풀다가 막혀서 끙끙거렸고.. 이제 앞으로 많은 문제들을 풀때 초석이 될 것 같은 문제였다. 더 고민해봐야 할 것은 연산식의 우선순위를 결정하는 코드인 것 같다. 연산식들의 우선순위를 자유자재로 매기고 그것들을 쉽게 풀 수 있을때 이런 문제에 자신감을 얻을 수 있을 것 같다.

코드

package ssafy.swexpert.d4;

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.Stack;

public class Calculator2 {
	public static void main(String[] args) throws NumberFormatException, IOException {
		BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
		for (int t = 1; t <= 10; t++) {
			int n = Integer.parseInt(br.readLine());
			Stack<Character> calStack = new Stack<>();
			Stack<Integer> sumStack = new Stack<>();
			StringBuilder stb = new StringBuilder();
			String line = br.readLine();

			// 후위연산자로 변환
			for (int i = 0; i < line.length(); i++) {
				char c = line.charAt(i);
				if (c >= '0' && c <= '9') {
					stb.append(c);
				} else {
					while (!calStack.isEmpty() && calStack.peek() <= c) {
						stb.append(calStack.pop());
					}
					calStack.push(c);
				}
			}
			while (!calStack.isEmpty()) {
				stb.append(calStack.pop());
			}
			System.out.println(stb.toString());
			// 밑에는 계산
			for (int i = 0; i < stb.length(); i++) {
				if (stb.charAt(i) >= '0' && stb.charAt(i) <= '9')
					sumStack.push(stb.charAt(i) - '0');
				else if (stb.charAt(i) == '+') {
					sumStack.push(sumStack.pop() + sumStack.pop());
				} else if (stb.charAt(i) == '*') {
					sumStack.push(sumStack.pop() * sumStack.pop());
				}
			}

			System.out.println("#" + t + " " + sumStack.pop());

		}
	}

}

기억에 남길 것!

  • 연산자의 우선순위는 어떻게 만들어야할까?
  • 후위연산자는 스택
© 2020 JunhoBaik, Built with Gatsby