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 |
'알고리즘 > 백준' 카테고리의 다른 글
| 백준 10808 알파벳 개수 자바[java] (0) | 2023.01.07 |
|---|---|
| 백준 1918 후위표기식 자바[java] (0) | 2023.01.06 |
| 백준 17299 오등큰수 자바[java] (0) | 2023.01.04 |
| 백준 17298 오큰수 자바[java] (0) | 2023.01.04 |
| 백준 10799 쇠막대기 자바[java] (0) | 2023.01.03 |