코딩테스트

[BOJ_1918/JAVA] 후위 표기식

Eun 2021. 12. 27. 17:51

https://www.acmicpc.net/problem/1918

 

1918번: 후위 표기식

첫째 줄에 중위 표기식이 주어진다. 단 이 수식의 피연산자는 알파벳 대문자로 이루어지며 수식에서 한 번씩만 등장한다. 그리고 -A+B와 같이 -가 가장 앞에 오거나 AB와 같이 *가 생략되는 등의

www.acmicpc.net

문제

풀이

해당 문제는 스택으로 푼다.

 

1. 연산자를 만났을 경우

2. 피연산자를 만났을 경우

3. 괄호를 만났을 경우

로 크게 나눈다.

 

연산자를 만났을 경우 연산자들 간의 우선순위를 정하여 스택에 들어오려는 연산자가 더 클 경우 push하고 peek한 연산자가 더 클 경우 pop을 해준다.

피연산자를 만났을 경우 StringBuilderd에 바로 추가해준다.

괄호를 만났을 경우 '('면 push해주고 ')'면 '('나올때까지 pop을 해준다.

 

코드

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.Stack;

public class BOJ1918 {

	public static void main(String[] args) throws IOException {
		// TODO Auto-generated method stub

		BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
		StringBuilder sb = new StringBuilder();
		
		Stack<Character> stack = new Stack<>();
		
		String input = br.readLine();
		
		for(int i=0;i<input.length();i++) {
			char c = input.charAt(i);
			
			switch(c) {
			case '+' :
			case '-' :
			case '*' :
			case '/' :
				while(!stack.isEmpty() && prior(stack.peek()) >= prior(c)) {
					sb.append(stack.pop());
				}
				stack.push(c);
				break;
			case '(' :
				stack.push(c);
				break;
			case ')' :
				while(!stack.isEmpty() && stack.peek()!='(') {
					sb.append(stack.pop());
				}
				stack.pop();
				break;
			default : 
				// 피연산자일때
				sb.append(c);
			}
		}
		
		while(!stack.isEmpty()) {
			sb.append(stack.pop());
		}
		
		System.out.println(sb);
	
	}
	
	public static int prior(char c) {
		if(c=='(' || c==')') {
			return 0;
		}else if(c=='+'||c=='-') {
			return 1;
		}else if(c=='*'||c=='/'){
			return 2;
		}
		return -1;
	}

}

'코딩테스트' 카테고리의 다른 글

[BOJ_6588/JAVA] 골드바흐의 추측  (0) 2021.12.30
[BOJ_1929/JAVA] 소수 구하기  (0) 2021.12.29
[BOJ_17299/JAVA] 오등큰수  (0) 2021.12.27
[BOJ_17298/JAVA] 오큰수  (0) 2021.12.19
[BOJ_9093/JAVA] 단어뒤집기  (0) 2021.12.16