코딩테스트/SWEA

[SWEA] 1223 계산기2 - JAVA

5월._. 2022. 2. 9.
728x90

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. 결과

너무 단순하게 음 곱하기는 더하기보다 앞에 있어야지~ 앞으로 왔다갔다 추가해야겠다! <-라고 생각하고 덱을 사용했다. 하지만 스택을 사용해도 결과는 같다. 당연한 일이었다. 어차피 +일때는 그 앞의 부호를 전부 빼주기 때문이다.

 

코드 중복이 싫어서 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

댓글