알고리즘/PS - 백준

[백준 1935 - Java] 후위 표기식2

excited-hyun 2021. 11. 1. 11:30
반응형

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억보다 작거나 같은 입력만 주어진다.

출력

계산 결과를 소숫점 둘째 자리까지 출력한다.

 

풀이

스택을 이용해서 간단하게 해결 가능한 문제입니다.

피연산자의 경우엔 스택에 해당 값을 push 해줍니다.

연산자의 경우엔 스택에서 값 2개를 pop하여 해당 연산자로 연산한 값을 다시 push 해줍니다.

이렇게 후위표기식의 맨 앞부터 확이하면서 진행하면 마지막에 스택에 남아있는 값이 답이 됩니다.

 

import java.util.Scanner;
import java.util.*;

public class Main {

	public static void main(String[] args) {
		Scanner sc = new Scanner(System.in);
		int num = sc.nextInt();
		int[] arr = new int[num+1];
		String s = sc.next();

		for(int i=0; i<num; i++)
			arr[i] = sc.nextInt();

		Stack<Double> stack = new Stack<Double>();

		for(int i=0; i<s.length(); i++) {
			char c = s.charAt(i);
			if(c == '+') {
				double num2 = stack.pop();
				double num1 = stack.pop();
				double num3 = num1 + num2;
				stack.add(num3);
			}
			else if (c == '-') {
				double num2 = stack.pop();
				double num1 = stack.pop();
				double num3 = num1 - num2;
				stack.add(num3);
			}
			else if (c == '/') {
				double num2 = stack.pop();
				double num1 = stack.pop();
				double num3 = num1 / num2;
				stack.add(num3);
			}
			else if (c == '*') {
				double num2 = stack.pop();
				double num1 = stack.pop();
				double num3 = num1 * num2;
				stack.add(num3);
			}
			else {
				int idx = c - 'A';
				stack.add((double) arr[idx]);
				
			}
		}
		double ans = stack.pop();
		System.out.printf("%.2f\n", ans);

	}

}
728x90
반응형

'알고리즘 > PS - 백준' 카테고리의 다른 글

[백준 1189 - Java] 컴백홈  (0) 2021.11.01
[백준 1918 - Java] 후위 표기식  (0) 2021.11.01
[백준 2234 - Java] 성곽  (0) 2021.10.14
[백준 11967 - Java] 불켜기  (0) 2021.10.12
[백준 1976 - Java] 여행 가자  (0) 2021.10.12