문제#
- 링크로 대체
풀이 및 주저리..
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());
}
}
}
기억에 남길 것!
- 연산자의 우선순위는 어떻게 만들어야할까?
- 후위연산자는 스택