SWEA 1222 계산기1 D4 (자바 Java)

SWEA 1222 계산기1

문제 정보

  • 문제 출처 : SW Expert Academy
  • 문제 번호 : 1222
  • 문제 제목 : 계산기1
  • 문제 난이도 : D4
  • 풀이 언어 : Java

문제

문자열로 이루어진 계산식이 주어질 때, 이 계산식을 후위 표기식으로 바꾸어 계산하는 문제

접근

Stack 을 활용해 문제를 풀었다.

풀이

  • Scanner 를 이용해 테스트 케이스의 길이와 문자열을 입력 받습니다.
  • 입력 받은 중위 표기식을 저장할 String exp 변수를 선언합니다.
  • 연산자를 저장할 Stack<Character>와 계산 결과를 저장할 Stack<Integer>를 각각 선언합니다.
  • 후위 표기식을 저장할 StringBuilder postExp 를 선언합니다.
  • exp의 각 문자를 순회하면서, 숫자라면 postExp 에 추가하고, 연산자라면 스택이 비어있지 않은 동안 스택의 내용을 postExp에 추가한 다음, 현재 연산자를 스택에 push합니다.
  • 순회가 끝난 후 스택에 남은 연산자를 postExp에 추가합니다.
  • postExp의 각 문자를 순회하면서, 숫자라면 스택에 push하고, 연산자라면 스택에서 두 숫자를 pop하여 계산한 후 그 결과를 스택에 다시 push합니다.
  • 마지막으로 스택에 남은 값을 출력합니다.

후기

헷갈렸던 문제이다. 스택을 더 많이 활용해봐야겠다.

코드

Java
import java.util.Scanner;
import java.io.FileInputStream;
import java.util.Stack;
 
class Solution
{
    public static void main(String args[]) throws Exception
    {
        Scanner sc = new Scanner(System.in);
 
        for(int test_case = 1; test_case <= 10; test_case++)
        {
            int len = sc.nextInt();
            String exp = sc.next();
 
            Stack<Character> stack = new Stack<>();
            StringBuilder postfix = new StringBuilder();
            for (int i = 0; i < exp.length(); i++) {
                char c = exp.charAt(i);
                if (Character.isDigit(c)) {
                    postfix.append(c);
                } else {
                    while (!stack.isEmpty()) {
                        postfix.append(stack.pop());
                    }
                    stack.push(c);
                }
            }
            while (!stack.isEmpty()) {
                postfix.append(stack.pop());
            }
 
            Stack<Integer> numStack = new Stack<>();
            for (int i = 0; i < postfix.length(); i++) {
                char c = postfix.charAt(i);
                if (Character.isDigit(c)) {
                    numStack.push(c - '0');
                } else {
                    int b = numStack.pop();
                    int a = numStack.pop();
                    numStack.push(a + b);
                }
            }
            System.out.println("#" + test_case + " " + numStack.pop());
        }
    }
}
Java

Leave a Comment