728x90
![[SWEA] 1223 계산기2 - JAVA [SWEA] 1223 계산기2 - JAVA](http://t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png)
1. 문제
SW Expert Academy
SW 프로그래밍 역량 강화에 도움이 되는 다양한 학습 컨텐츠를 확인하세요!...
swexpertacademy.com
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. 결과
![[SWEA] 1223 계산기2 - JAVA - 3. 결과 [SWEA] 1223 계산기2 - JAVA - 3. 결과](http://t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png)
너무 단순하게 음 곱하기는 더하기보다 앞에 있어야지~ 앞으로 왔다갔다 추가해야겠다! <-라고 생각하고 덱을 사용했다. 하지만 스택을 사용해도 결과는 같다. 당연한 일이었다. 어차피 +일때는 그 앞의 부호를 전부 빼주기 때문이다.
코드 중복이 싫어서 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 |
댓글