문제


입력 및 출력


풀이

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

class Main {
    public static void main(String args[]) throws Exception {
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));

        // 피연산자의 개수 N
        int N = Integer.parseInt(br.readLine());

        // 피연산자는 A-Z 영대문자이며, A부터 순서대로 N개의 영대문자만 사용
        char[] array = br.readLine().toCharArray();

        // 후입선출의 자료구조 Stack선언
        Stack < Double > stack = new Stack < > ();

        // 키와 값으로 구성된 Map선언
        Map < Character, Double > map = new HashMap < > ();

        // N의 개수만큼 피연산자에 대응되는 값을 설정
        char key = 'A';
        for (int i = 0; i < N; i++) {
            map.put(key, Double.parseDouble(br.readLine()));
            key++;
        }

        // array의 길이만큼 반복문 수행
        for (int i = 0; i < array.length; i++) {
            // 인덱스의 값이 A-Z인 경우
            if ('A' <= array[i] && array[i] <= 'Z') {
                stack.push(map.get(array[i]));
            }
            // 그외의 경우
            else {
                double answer1 = stack.pop();
                double answer2 = stack.pop();

                switch (array[i]) {
                    case '+':
                        stack.push(answer2 + answer1);
                        break;
                    case '-':
                        stack.push(answer2 - answer1);
                        break;
                    case '*':
                        stack.push(answer2 * answer1);
                        break;
                    case '/':
                        stack.push(answer2 / answer1);
                        break;
                }
            }
        }
        // 결과 값 출력
        System.out.println(String.format("%.2f", stack.pop()));
    }
}

결과 및 해결방법

[결과]

[정리]

해결방법

  • 피연산자의 개수 N을 사용자로부터 입력받는다.

    피연산자는 A-Z 영대문자이며, A부터 순서대로 N개의 영대문자만 사용한다. 예를들어, N이 5일 경우 A, B, C, D, E의 대응되는 값을 사용자로부터 입력받는다.

    각 알파벳에 대응되는 값을 설정하기 위해서 Map을 사용하였고 KEY로 알파벳을 받고, VALUE로 대응되는 값을 입력받는다.

  • 배열의 길이만큼 반복문을 수행한다.

    반복문 내부는 두 가지 조건으로 수행되는데, 배열의 i번째 값이 알파벳인 경우와 연산자인 경우로 나뉜다.

    배열의 i번째 값이 알파벳인 경우, 스택에 알파벳에 대응되는 값을 넣어준다.

    배열의 i번째 값이 연산자인 경우, 계산을 하기 위해 스택에 넣었던 두개의 값을 빼내 선언한 answer1변수와 answer2변수에 저장한다. Switch-case문을 사용하여 연산자에 맞는 계산을 수행한다. 이때, answer2가 처음에 배치되어야 한다. 그 이유는 스택은 후입선출의 특징을 갖고 있기 때문이다.

  • String.format메소드를 사용하여 소수점 2자리까지 결과 값을 표현한다.

profile
"계획에 따르기보다 변화에 대응하기를"

0개의 댓글