• 문제 링크
1918번: 후위 표기식
첫째 줄에 중위 표기식이 주어진다. 단 이 수식의 피연산자는 알파벳 대문자로 이루어지며 수식에서 한 번씩만 등장한다. 그리고 -A+B와 같이 -가 가장 앞에 오거나 AB와 같이 *가 생략되는 등의
www.acmicpc.net
• 풀이 과정
후위 표현식을 저장할 StringBuilder 와 연산자의 우선 순위를 구하기 위해 Stack 자료구조를 활용한다.
입력받은 수식의 한 문자 단위로 탐색을 수행하고, 피연산자인 경우 StringBuilder 객체 sb 에 저장,
+, -, *, / 의 경우 연산자의 우선 순위를 스택의 상단의 연산자와 해당 연산자를 비교하는 priority 함수를 통해
스택에 저장할 지, 스택의 모든 연산자를 꺼내 sb 에 저장할 지 결정한다.
이때 +, - = 1 의 우선 순위, *, / = 2 의 우선 순위를 가진다.
( 의 경우 그대로 스택에 저장하고 이는 가장 낮은 우선 순위를 가진다.
) 의 경우 스택의 모든 연산자를 꺼내 sb 에 저장하되 스택 상단의 값이 ( 일 때까지만 수행하고 ( 은 pop() 하여 버린다.
탐색을 끝낸 뒤 스택에 남아있는 연산자들을 모두 꺼내 sb 에 저장하고 정답으로써 출력한다.
• 풀이 코드
import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.OutputStreamWriter;
import java.util.Stack;
public class Main {
public static void main(String[] args) throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(System.out));
String input = br.readLine();
StringBuilder sb = new StringBuilder();
Stack<Character> stk = new Stack<>();
for (int i = 0; i < input.length(); i++) {
char now = input.charAt(i);
if (now == '+' || now == '-' || now == '*' || now == '/') {
while (!stk.empty() && priority(stk.peek()) >= priority(now))
sb.append(stk.pop());
stk.push(now);
} else if (now == '(') {
stk.push(now);
} else if (now == ')') {
while (!stk.empty() && stk.peek() != '(')
sb.append(stk.pop());
stk.pop();
} else {
sb.append(now);
}
}
while (!stk.empty())
sb.append(stk.pop());
bw.write(sb + "\n");
bw.flush();
}
private static int priority(char oper) {
if (oper == '(')
return 0;
else if (oper == '+' || oper == '-')
return 1;
else
return 2;
}
}
'Problem Solving > Baekjoon' 카테고리의 다른 글
[백준] 11279 최대 힙 - Data Structure / Java (0) | 2022.07.24 |
---|---|
[백준] 1927 최소 힙 - Data Structure / Java (0) | 2022.07.24 |
[백준] 9935 문자열 폭발 - Data Structure / Java (0) | 2022.07.22 |
[백준] 11053 가장 긴 증가하는 부분 수열 - Dynamic Programming / Java (0) | 2022.07.21 |
[백준] 11052 카드 구매하기 - Dynamic Programming / Java (0) | 2022.07.19 |
댓글