1935번: 후위 표기식2

첫째 줄에 피연산자의 개수(1 ≤ N ≤ 26) 가 주어진다. 그리고 둘째 줄에는 후위 표기식이 주어진다. (여기서 피연산자는 A~Z의 영대문자이며, A부터 순서대로 N개의 영대문자만이 사용되며, 길이

www.acmicpc.net

문제 간단설명)

숫자를 먼저 받고 그 후 연산기호를 받는다.

연산기호로 앞에서 받은 두 숫자를 계산하는 것이 후위표기식이다.

예를들어 "2 + 3"의 경우 "2 3 +",

"2 + 3 * 4"의 경우 "2 3 4 * +" 로 쓴다

 

더보기

스택을 이용해서 후위표기식 자체는 잘 표현했다.

근데 문제를 제대로 보지 않아서 틀렸다,,

문제에서 A에 해당하는 값은 세번째줄,

B에 해당하는 값은 네번째 줄 등등등으로 주어지는데

이 부분을 놓쳤다.

다른 사람의 풀이를 보고 잘못된 부분을 바로 잡았다.

 

풀이)

후위표기식을 스택으로 구현하는 것은 간단하다.

우선 숫자들을 스택에 넣는다.

만약 연산기호가 나온다면

받았던 숫자 두 개를 꺼내서 연산기호에 맞게 계산한다.

계산한 값을 다시 스택에 넣는다.

이를 반복하고,

마지막엔 스택에 들어가있는 결과 값을 출력한다.

 

디테일)

+ 와 x는 상관없지만

- 와 /는 조금 더 신경써주어야 한다.

"2 - 3" 의 경우 

"2 3 -" 로 표현할 수 있다.

스택에 2들어가고,

스택에 3 들어가고

연산기호 마이너스를 만나면 각 스택에 있는 값들을 가지고와서 계산한다.

여기서 가져온 순서 그대로 계산하게 되면,,

"3 - 2"가 된다.

가장 최근에 들어갔던 3이 먼저나오고 그 후 2가 나오게되서

원래 계산하려는 결과와 달라진다.

그러기에 빼기와 나누기는 순서를 신경써서 코드를 짜야한다.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
import java.io.*;
import java.util.*;
public class Main {
    public static void main(String[] args) throws IOException {
        Scanner sc = new Scanner(System.in);
        BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(System.out));
        Stack<Double> stk = new Stack<>();
 
        double result = 0;
        double tmp = 0;
        int N = sc.nextInt();
        String str = sc.next();
        double[] arr = new double[N];
 
        for(int i = 0; i < N; i++){
            arr[i] = sc.nextDouble();
        }
 
        for(int i = 0; i < str.length(); i++){
            char ch = str.charAt(i);
 
            if(('A' <= ch && ch <= 'Z')){
                stk.add(arr[ch - 'A']);
            }
            else{
                switch (ch){
                    case '+':
                        result = stk.pop() + stk.pop();
                        stk.add(result);
                        break;
 
                    case '-':
                        tmp = stk.pop();
                        result = stk.pop() - tmp;
                        stk.add(result);
                        break;
 
                    case '*':
                        result = stk.pop() * stk.pop();
                        stk.add(result);
                        break;
 
                    case '/':
                        tmp = stk.pop();
                        result = stk.pop() / tmp;
                        stk.add(result);
                        break;
                }
            }
 
        }
        System.out.printf("%.2f", stk.pop());
    }
}
 
cs

+ Recent posts