본문 바로가기
백준/1 - 5000

[백준] 1918번 : 후위 표기식(JAVA)

by lms0806 2021. 7. 27.
728x90
반응형

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

 

1918번: 후위 표기식

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

www.acmicpc.net

풀이

주어진 예제와 같이

이런 방식으로 계산식을 뒤에 써주면 되는 문제입니다.

"표기식은 알파벳 대문자와 +, -, *, /, (, )로만 이루어져 있으며, 길이는 100을 넘지 않는다. "

"("가 나올 시 ")"가 나오면 "("가 있는 부분까지 전부 출력해주면 됩니다.

사칙연산의 우선순위느 *, / > +, - 입니다.

 

스택을 이용해서 다음과 같이 풀어주면 됩니다.

 

소스코드

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

public class Main {
	public static void main(String[] args) throws IOException{
		BufferedReader br = new BufferedReader(new InputStreamReader(System.in)); 
		
		Stack<Character> stack = new Stack<>();
		
		StringBuilder sb = new StringBuilder();
		for(char ch : br.readLine().toCharArray()) {
			if(ch >= 'A' && ch <= 'Z') {
				sb.append(ch);
			}
			else if(ch == '*' || ch == '/') {
				while(!stack.empty() && (stack.peek() == '*' || stack.peek() == '/')) {
					sb.append(stack.pop());
				}
				stack.add(ch);
			}
			else if(ch == '+' || ch == '-') {
				while(!stack.empty() && (stack.peek() == '*' || stack.peek() == '/' || stack.peek() == '+' || stack.peek() == '-')) {
					sb.append(stack.pop());
				}
				stack.add(ch);
			}
			else if(ch == '(') {
				stack.add(ch);
			}
			else if(ch == ')') {
				while(stack.peek() != '(') {
					sb.append(stack.pop());
				}
				stack.pop();
			}
		}
		
		while(!stack.isEmpty()) {
			sb.append(stack.pop());
		}
		System.out.print(sb);
	}
}

 

 

728x90
반응형

댓글