https://www.acmicpc.net/problem/1918
스택 사용하는 문제이다.
처음에는 괄호를 치고 계산하려고 했는데 괄호 치는 과정이 너무 어려워서 관둠.
일단 '(' 가 나오면 ')' 가 나와야하는게 자명함
그리고 ')'가 나오면 '('가 나올 때까지 어딘가에 저장해둔 연산자를 빼야하는것도 자명하다!
그럼 이걸 1. 어딘가에 저장해야하고 2. 연산자를 어떻게 빼서 가져올지
고민하면 될 것 같다.
물론 저도 틀렸음ㅎㅎㅋㅋㅋ
코드
import java.util.*;
import java.io.*;
public class Main {
public static void main(String[] args) throws Exception {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
char[] expression = br.readLine().toCharArray();
StringBuilder sb = new StringBuilder();
Stack<Character> stack = new Stack<>();
for(int i=0; i<expression.length; i++) {
char now = expression[i];
// A~Z값이 나오면 바로 append() 한다.
if(now >= 'A' && now <= 'Z') {
sb.append(now);
}
else if(now == '(') {
stack.add(now);
} else if(now == ')') { // ')'가 나오면 '('가 나올 때까지 연산자 append()
while(stack.peek() != '(') {
sb.append(stack.pop());
}
stack.pop(); // '(' 도 pop()
}
// 연산자일 때
else {
// 스택 제일 바깥에 있는 연산자가 현재 연산자보다 우선순위가 높거나 같으면 append()
while(!stack.isEmpty() && num(stack.peek()) >= num(now)) {
sb.append(stack.pop());
}
stack.add(now);
}
}
// 나머지 애들 append()
while(!stack.isEmpty()) {
sb.append(stack.pop());
}
System.out.println(sb.toString());
}
private static int num(char op) {
switch (op) {
case '+':
return 1;
case '-':
return 1;
case '*':
return 2;
case '/':
return 2;
default:
return -1;
}
}
}
백준이 갑자기 안돼서 성능을 못보여드리네용..?
아무튼 어려운 문제였다. 문제 푸는연습 계속 해야지...!!
'알고리즘 > 백준' 카테고리의 다른 글
[BaekJoon] 백준 11057번 _ 오르막 수 for JAVA (0) | 2023.06.14 |
---|---|
[BackJoon] 백준 9465번 _ 스티커 for JAVA (1) | 2023.06.13 |
[BaekJoon] 백준 1764번 _ 듣보잡 for JAVA (0) | 2023.06.06 |
[BaekJoon] 백준 2607번 _ 비슷한 단어 for JAVA (0) | 2023.06.05 |
[BaekJoon] 백준 20920번 _ 영단어 암기는 어려워 for JAVA (0) | 2023.06.04 |