백준

[백준_1935번] 후위 표기식2

빙수빈수 2021. 8. 10. 20:16

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

 

1935번: 후위 표기식2

첫째 줄에 피연산자의 개수(1 ≤ N ≤ 26) 가 주어진다. 그리고 둘째 줄에는 후위 표기식이 주어진다. (여기서 피연산자는 A~Z의 영대문자이며, A부터 순서대로 N개의 영대문자만이 사용되며, 길이

www.acmicpc.net

[문제]

 후위 표기식과 각 피연산자에 대응하는 값들이 주어져 있을 때, 그 식을 계산하는 프로그램을 작성하시오.

 

[입력 조건]

 첫째 줄에 피연산자의 개수(1 ≤ N ≤ 26) 가 주어진다. 그리고 둘째 줄에는 후위 표기식이 주어진다. (여기서 피연산자는 A~Z의 영대문자이며, A부터 순서대로 N개의 영대문자만이 사용되며, 길이는 100을 넘지 않는다) 그리고 셋째 줄부터 N+2번째 줄까지는 각 피연산자에 대응하는 값이 주어진다. 3번째 줄에는 A에 해당하는 값, 4번째 줄에는 B에 해당하는값 , 5번째 줄에는 C ...이 주어진다, 그리고 피연산자에 대응 하는 값은 100보다 작거나 같은 자연수이다.

후위 표기식을 앞에서부터 계산했을 때, 식의 결과와 중간 결과가 -20억보다 크거나 같고, 20억보다 작거나 같은 입력만 주어진다.

 

[코드]

import java.util.*;

public class BaekJoon_1935 {

	public static void main(String[] args) {
		// TODO Auto-generated method stub
		Scanner sc=new Scanner(System.in);
		Stack<Double> stack=new Stack<>();
		int n=sc.nextInt();
		
		String str=sc.next(); // 후위식 입력 받기
		double[] number=new double[27];
		
		// 숫자 입력 받기
		for(int i=0;i<n;i++)
			number[i]=sc.nextDouble();
		
		// 후위식 계산
		for(int i=0;i<str.length();i++) {
			int code=(int)str.charAt(i);
			
			// 숫자라면 스택에 삽입
			if(code>=65&&code<=90)
				stack.push(number[code-65]);
			
			// 문자라면 스택에서 두 숫자를 꺼내 연산 후 다시 스택에 삽입한다.
			else {
				double a=stack.pop();
				double b=stack.pop();
				double result=0;
				
				switch(code) {
				case 42: // * 인 경우
					result=b*a;
					break;
				case 43: // + 인 경우
					result=b+a;
					break;
				case 47: // / 인 경우
					result=b/a;
					break;
				case 45: // - 인 경우
					result=b-a;
					break;
				}
				
				stack.push(result);
			}
		}
		
		// 계산이 끝난 결과 값을 소숫점 둘째 자리까지 출력한다.
		System.out.printf("%.2f",stack.pop());
	}

}

 

[고찰]

 후위 표기식은 스택을 사용하여 해결해야 하는 문제였다. 후위식의 연산 방법을 문자일 경우에는 스택에 삽입하고, 연산자일 경우에는 스택에서 두 피연산자를 꺼내 연산 후 결과 값을 스택에 삽입하면 된다. 후위식의 연산 방법만 안다면 쉽게 해결할 수 있는 문제였다.

'백준' 카테고리의 다른 글

[백준_2346번] 풍선 터뜨리기  (0) 2021.08.11
[백준_10799번] 쇠막대기  (0) 2021.08.10
[백준_2217번] 로프  (0) 2021.08.10
[백준_18310번] 안테나  (0) 2021.08.10
[백준_10825번] 국영수  (0) 2021.08.10