본문 바로가기
알고리즘/백준

[Java] BOJ 1918번 후위 표기식

by 컴공맨 2021. 10. 19.
 

1918번: 후위 표기식

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

www.acmicpc.net


풀이

우선 연산자별 우선순위를 정하고 스택을 사용하여 해결했습니다.


코드

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

public class Main {
	public static Map<Character, Integer> opPriority, innerOpPriority;
	public static Stack<Character> stk;
	public static void main(String[] args) throws IOException {
		BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
		StringBuilder sb = new StringBuilder("");
		
		String input = br.readLine();
		stk = new Stack<>();
		
		// 연산자 우선순위를 설정
		opPriority = new HashMap<>();
        opPriority.put('(', 3);
		opPriority.put('*', 2);
		opPriority.put('/', 2);
		opPriority.put('+', 1);
		opPriority.put('-', 1);
		
		innerOpPriority = new HashMap<>();
		innerOpPriority.put('*', 2);
		innerOpPriority.put('/', 2);
		innerOpPriority.put('+', 1);
		innerOpPriority.put('-', 1);
		innerOpPriority.put('(', 0);
		
		for (int i = 0; i < input.length(); ++i) {
			char cur = input.charAt(i);
			
			if (cur >= 'A' && cur <= 'Z') {
				sb.append(cur);
				continue;
			}
			
			if (cur == ')') {
				while (stk.peek() != '(') {
					sb.append(stk.pop());
				}
				if (!stk.isEmpty()) {
					stk.pop();					
				}
				continue;
			}
			
			while (!stk.isEmpty() && innerOpPriority.get(stk.peek()) >= opPriority.get(cur)) {
				sb.append(stk.pop());
			}
			stk.push(cur);
		}
		
		while (!stk.isEmpty()) {
			sb.append(stk.pop());
		}
		
		System.out.println(sb);
	}
}

 

GitHub - pyo7410/Algorithm: 1일 1커밋을 목표로!

1일 1커밋을 목표로! Contribute to pyo7410/Algorithm development by creating an account on GitHub.

github.com