[1935] 후위 표기식2

Update:     Updated:

카테고리:

태그:

[Silver III] 후위 표기식2 - 1935

문제 링크

성능 요약

메모리: 14600 KB, 시간: 136 ms

분류

자료 구조, 스택

문제 설명

후위 표기식과 각 피연산자에 대응하는 값들이 주어져 있을 때, 그 식을 계산하는 프로그램을 작성하시오.

입력

첫째 줄에 피연산자의 개수(1 ≤ N ≤ 26) 가 주어진다. 그리고 둘째 줄에는 후위 표기식이 주어진다. (여기서 피연산자는 A~Z의 영대문자이며, A부터 순서대로 N개의 영대문자만이 사용되며, 길이는 100을 넘지 않는다) 그리고 셋째 줄부터 N+2번째 줄까지는 각 피연산자에 대응하는 값이 주어진다. 3번째 줄에는 A에 해당하는 값, 4번째 줄에는 B에 해당하는값 , 5번째 줄에는 C ...이 주어진다, 그리고 피연산자에 대응 하는 값은 100보다 작거나 같은 자연수이다.

후위 표기식을 앞에서부터 계산했을 때, 식의 결과와 중간 결과가 -20억보다 크거나 같고, 20억보다 작거나 같은 입력만 주어진다.

출력

계산 결과를 소숫점 둘째 자리까지 출력한다.

아이디어

후위 표기식의 계산 방법만 알면 간단히 풀 수 있는 문제였다.
stack 자료구조를 이용해서 구현했다.
추가로, double형 데이터의 출력 포멧팅에 대해서도 복습할 수 있는 시간이었다.

답안코드

import java.io.*;
import java.util.*;

public class Main {
    public static void main(String[] args) throws IOException {
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(System.out));

        int n = Integer.parseInt(br.readLine());
        String[] ss = br.readLine().split("");
        List<String> operator = Arrays.asList("+", "-", "*", "/");

        // 각 변수에 맞는 숫자 변환
        for (int i = 0; i < n; i++) {
            String num = br.readLine();
            for (int j = 0; j < ss.length; j++) {
                if (ss[j].equals(Character.toString('A' + i))) {
                    ss[j] = num;
                }
            }
        }

        // stack을 사용한 후위 연산 수행
        Deque<String> stack = new ArrayDeque<>();
        for (String s : ss) {
            if (operator.contains(s)) {
                double y = Double.parseDouble(stack.pop());
                double x = Double.parseDouble(stack.pop());

                if (s.equals("+")) {
                    stack.push(String.format("%.2f", x + y));
                } else if (s.equals("-")) {
                    stack.push(String.format("%.2f", x - y));
                } else if (s.equals("*")) {
                    stack.push(String.format("%.2f", x * y));
                } else {
                    stack.push(String.format("%.2f", x / y));
                }
            } else {
                stack.push(s);
            }
        }

        bw.write(stack.pop());
        bw.flush();
        bw.close();
    }
}

BOJ 카테고리 내 다른 글 보러가기

댓글 남기기