알고리즘/백준

[BaekJoon] 백준 1918번 _ 후위 표기식 for JAVA

정석이 2023. 6. 7. 22:47

 

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;
		}
	}
}

 

 

 

백준이 갑자기 안돼서 성능을 못보여드리네용..?

 

 

 

아무튼 어려운 문제였다. 문제 푸는연습 계속 해야지...!!