코딩테스트/SWEA

[SWEA] 1224 계산기3 - JAVA

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

1. 문제

 

SW Expert Academy

SW 프로그래밍 역량 강화에 도움이 되는 다양한 학습 컨텐츠를 확인하세요!

swexpertacademy.com


2. 풀이

후위연산식으로 바꾸기

1. '('라면 연산자스택에 push

2. 숫자라면 후위연산식에 더하기

3. 1,2 모두 아니라면 <스택이 비거나 peek이 '('가 아니고 우선순위가 나(ch)보다 클 때> pop하며 후위연산식에 계속 더해준다.

4. ')'라면 마지막에 '('가 남았을것이므로 pop을 해주고, 부호라면 연산자스택에 push한다.

 

* 우선순위 체크 함수

괄호면 0, +-는 1, */는 2를 반환했다. -1은 오류값.

 

스택을 이용한 후위연산식 계산방법은  [SWEA] 1223 계산기2 와 동일하다.

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

public class D4_1224_계산기3 {
    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();
            Stack<Character> operator = new Stack<>();

            for (int i = 0; i < len; i++) {
                char ch = line.charAt(i);
                if (ch == '(') {
                    operator.push(ch);
                    continue;
                }
                else if(ch>='0' && ch<='9'){
                    postfix.append(ch);
                    continue;
                }

                //여기서부터는 ), 부호만 남음
                while (!operator.empty() && operator.peek() != '(' && checkPriority(operator.peek()) >= checkPriority(ch)) {
                    postfix.append(operator.pop());
                }

                if(ch==')') operator.pop();
                else operator.push(ch);

            }

            //stack에 넣어가면서 계산하기
            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("#" + tc + " " + calculator.pop());

        }
    }

    //우선순위 체크 함수
    public static int checkPriority(char ch){
        switch(ch){
            case '(': case ')':return 0;
            case '+': case '-':return 1;
            case '*': case '/':return 2;
        }
        return -1;
    }
}

3. 결과

가장 아래에 있는 결과는 아스키코드값을 이용해 우선순위를 판단했다. 이 문제는 그렇게 해도 통과가 되지만(부호가 +,*밖에 없음) -나 /가 등장할 경우 적용하기 힘들다. 

그래서 우선순위 판단 함수를 따로 만들었다.

중간 결과는 약간 시행착오인데, 우선순위 함수를 만들고 나서 적용만 한 코드다.

함수를 만들고보니 필요없는 코드들이 생겨서 좀 더 지워주고 다시 실행했다. 오히려 아스키코드를 이용할 때보다 더 코드도 짧고 실행시간도 아주 약간 짧아졌다.

 

+ 처음코드

+ 두번째코드

+ 마지막 코드(위와 동일)

'코딩테스트 > SWEA' 카테고리의 다른 글

[SWEA] 1233 사칙연산 유효성 검사 - JAVA  (0) 2022.02.11
[SWEA] 1210 Ladder1 - JAVA  (0) 2022.02.09
[SWEA] 1223 계산기2 - JAVA  (0) 2022.02.09
[SWEA] 1861 정사각형 방 - JAVA  (0) 2022.02.09
[SWEA] 3499 퍼펙트셔플  (0) 2022.02.09

댓글