728x90
1. 문제
2. 풀이
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.ArrayDeque;
import java.util.Deque;
import java.util.Stack;
public class D4_1223_계산기2 {
public static void main(String[] args) throws IOException {
BufferedReader in = new BufferedReader(new InputStreamReader(System.in));
for (int tc = 1; tc <= 10; tc++) {
int len = Integer.parseInt(in.readLine());
String line = in.readLine();
//postfix로 바꾸기
StringBuilder postfix = new StringBuilder();
Deque<Character> operator = new ArrayDeque<>();
for (int i = 0; i <= len; i++) {
if(i==len || line.charAt(i)=='+'){
while(!operator.isEmpty()){
postfix.append(operator.pollFirst());
}
if(i==len) break;
}
char ch = line.charAt(i);
if(ch=='*') operator.offerFirst(ch);
else if(ch=='+') operator.offerLast(ch);
else postfix.append(ch);
}
//숫자 스택에 넣어가면서 계산하기
Stack<Integer> calculator = new Stack<>();
for(int i=0;i<postfix.length();i++){
char ch = postfix.charAt(i);
switch(ch){
case '+':
calculator.push(calculator.pop()+calculator.pop());
break;
case '*':
calculator.push(calculator.pop()*calculator.pop());
break;
default:
calculator.push(ch-'0');
break;
}
}
System.out.println(new StringBuilder("#").append(tc).append(" ").append(calculator.pop()));
}
}
}
(덱-> 스택으로 동일하게 풀기 가능)
후위 연산식으로 바꾸기
1. 숫자면 식에 그대로 넣는다.
2. *라면 연산자 스택에 넣는다.
3. +라면 연산자 스택이 빌 때까지 스택에서 연산자를 뽑아 식에 넣어준다. 그 후에 자기 자신(+)을 스택에 넣는다.
후위 연산식 스택으로 계산하기
1. 숫자라면 계산 스택에 넣어준다.
2. 부호라면 계산스택에서 맨 위의 두 숫자를 꺼낸 뒤 서로 연산한다. 연산한 결과는 다시 계산 스택에 넣는다.
3. 결과
너무 단순하게 음 곱하기는 더하기보다 앞에 있어야지~ 앞으로 왔다갔다 추가해야겠다! <-라고 생각하고 덱을 사용했다. 하지만 스택을 사용해도 결과는 같다. 당연한 일이었다. 어차피 +일때는 그 앞의 부호를 전부 빼주기 때문이다.
코드 중복이 싫어서 len까지 for문을 돌렸다. 중복은 사라졌는데 이렇게 짧게 짜려고 하다가 가독성을 놓치게 되는 건 아닌가 항상 고민된다.
'코딩테스트 > SWEA' 카테고리의 다른 글
[SWEA] 1210 Ladder1 - JAVA (0) | 2022.02.09 |
---|---|
[SWEA] 1224 계산기3 - JAVA (0) | 2022.02.09 |
[SWEA] 1861 정사각형 방 - JAVA (0) | 2022.02.09 |
[SWEA] 3499 퍼펙트셔플 (0) | 2022.02.09 |
[SWEA] 1218 괄호짝찾기 - JAVA (0) | 2022.02.07 |
댓글