https://www.acmicpc.net/problem/1918
아래 차량기지 알고리즘을 참조했다.
어려워서 나중에 또 풀기위해 남긴다.
Key Point
1. 스택에는 무조건 부호의 우선순위가 높은 순서로 쌓여야 한다.
2. 여는 괄호를 만나면 스택에 넣고, 닫는 괄호가 나왔을 때, 여는 괄호가 나올 때까지 계속 pop한다.
import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.util.HashMap;
import java.util.Stack;
public class Main {
public static void main(String[] args) throws Exception {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
StringBuilder sb = new StringBuilder();
Stack<Character> stack = new Stack<>();
String str = br.readLine();
// 각 부호에 우선순위 부여
HashMap<Character, Integer> dict = new HashMap<Character, Integer>() {{
put('+', 1);
put('-', 1);
put('*', 2);
put('/', 2);
put('(', 0);
}};
for (int i = 0; i < str.length(); i++) {
char temp = str.charAt(i);
if ('A' <= temp && temp <= 'Z') { // 알파벳이면 무조건 출력
sb.append(temp);
} else {
if (temp == '(') { // 여는 괄호가 나오면 무조건 스택에 push
stack.add(temp);
} else if (temp == ')') { // 닫는 괄호가 나오면 여는 괄호가 나올 때까지 스택에서 pop
char calc = ' ';
while (calc != '(') {
calc = stack.pop();
if (calc != '(') sb.append(calc);
}
} else { // 괄호 이외의 부호
while (!stack.isEmpty() && dict.get(temp) <= dict.get(stack.peek())) {
sb.append(stack.pop()); // 현재 포커스인 부호보다 스택에 쌓인 부호의 우선순위가 더 작으면 순선대로 pop 후 출력
}
stack.add(temp); // 현재 부호 스택에 push
}
}
}
while (!stack.isEmpty()) { // 스택에 남은 부호 출력
sb.append(stack.pop());
}
System.out.println(sb);
}
}
'코딩테스트 > 백준 알고리즘 (BOJ)' 카테고리의 다른 글
[백준] 2529번: 부등호 (JAVA, 문제, 문제풀이) (2) | 2023.12.05 |
---|---|
[백준] 11053번: 가장 긴 증가하는 부분 수열 (JAVA, 문제, 문제풀이) (0) | 2023.10.03 |
[백준] 6588번: 골드바흐의 추측 (JAVA, 문제, 문제풀이) (0) | 2023.09.20 |
[백준] 2750번: 수 정렬하기 (C++, 문제, 문제풀이) (0) | 2021.08.10 |