1918번 후위표기식
🅰 설계
- Stack을 배울 때 나오는 단골 문제다.
- 우선순위
0. '('
1. '+', '-'
2. '*', '/'
3. ')'
- 현재 연산자의 우선순위가 Stack에 있는 연산자의 우선순위보다 높거나 같으면 Stack에서 모두 꺼낸다.
- 현재 연산자의 우선순위가 Stack에 있는 연산자의 우선순위보다 낮으면 Stack에 넣는다.
- 마지막으로 남은 연산자를 붙여주면 끝
- 여기서 Stack에 넣는다는 것은, Stack에 있는 연산자보다 현재 연산자의 우선순위가 낮기 때문에 나중에 계산하겠다는 의미이다.
- 반대로 Stack에서 꺼낸다는 것은, Stack에 있는 연산자보다 현재 연산자의 우선순위가 높기 때문에 지금 계산하겠다는 의미이다.
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
|
import java.io.*;
import java.util.*;
public class 후위표기식{
static BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
public static void main(String[] args) throws IOException {
Stack<Character> stack = new Stack<>();
StringBuilder sb = new StringBuilder();
String input = br.readLine();
for(int i=0;i<input.length();i++){
char c = input.charAt(i);
switch (c){
case '+':
case '-':
while(!stack.isEmpty() && stack.peek() != '('){
sb.append(stack.pop());
}
stack.push(c);
break;
case '*':
case '/':
while(!stack.isEmpty() && (stack.peek() == '*' || stack.peek() == '/')){
sb.append(stack.pop());
}
stack.push(c);
break;
case '(':
stack.push(c);
break;
case ')':
while(stack.peek() != '('){
sb.append(stack.pop());
}
stack.pop();
break;
default:
sb.append(c);
break;
}
}
while(!stack.isEmpty()) sb.append(stack.pop());
System.out.print(sb.toString());
}
}
|
cs |
✅ 후기
- 항상 다시 알고리즘을 시작할 때 느끼는건데, 기억에 의존해서 풀려고 한다. 논리적으로 접근하고 검증해서 한 번에 맞추는 연습을 해야겠다.
'Problem Solving > Baekjoon' 카테고리의 다른 글
[ACMICPC] 1916 . 최소 비용 구하기 (0) | 2021.07.23 |
---|---|
[ACMICPC] 15684 . 사다리 조작 (0) | 2021.07.21 |
[ACMICPC] 1644 . 소수의 연속합 (0) | 2021.07.19 |
[ACMICPC] 14891 . 톱니바퀴 (0) | 2021.07.18 |
[ACMICPC] 1018 . 체스판 다시 칠하기 (0) | 2021.07.18 |