백준 풀기

백준 1935번: 후위 표기식2 with Java

삼겹살파튀 2024. 7. 26. 23:57

후위 표기식2

 
시간 제한메모리 제한제출정답맞힌 사람정답 비율
2 초 128 MB 26756 13100 10553 48.613%

문제

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

입력

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

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

출력

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

예제 입력 1 복사

5
ABC*+DE/-
1
2
3
4
5

예제 출력 1 복사

6.20

예제 입력 2 복사

1
AA+A+
1

예제 출력 2 복사

3.00

 

 

 


 

 

후위 표기식

rgrg

 

...

 

피연산자의 개수

후위표기식 A~Z랑 +-*/ 사용

A~Z에 대응하는 숫자 한 줄에 하나씩...

 

소수점둘째자리까지 출력...

 

후위표기식은 뭐였지 팝이었나 그런 거 쓰지 않았나?!!

팝...팝이 스택인가.... 스택...자바로는 어케함....

 

오 검색하고 옴

Stack<T> 이름 = new Stack<>();

자바는 이렇게 하면 된단다... int형으로 하면 되나???

 

짜다보니까 후위식 계산 방법이 헷갈리기 시작했다. 그... 숫자를 계속 넣다가 부호 나오면 팝하는 거.... 맞나....?? 이것도 헷갈리다니 취업하긴 글른건가? 역시 수정떡볶이가 답인가? 오늘은 제육볶음을 기깔나게 만들었는데 수정제육떡볶이가 답인가? 메뉴 제육볶음 떡볶이 제육떡볶이 순대 꼬마김밥 튀김... 

흑흑..흑흑흑..흑흑흑흑흑흑

 

찾아봤는데 맞는 듯....?

 

dddkdkdkdkfhk뭐야 ???? 왜 또 글이 날아간거야???? 티스토리 이거 자꾸 왜 로그아웃되지??

 

사라진 글.... Integer로 했더니 하다보니까 다시 넣었다 뻈다 해야하는데 계산이 짤림. 그래서 Double형으로 바꿨다는 말.

아니 근데 티스토리 왜케 로그아웃됨 컴이 꺼진 것도 아닌데...? 희한하네;;

나의 고뇌의 과정이 사라지다니.... 

글고 A - 숫자 이거 매치하는 게 헷갈렸음 근데.... 아스키 코드 다들 아시죠? 아스키키키키코드 이용하면 되는 거였음 

 

완성 코드

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.Stack;
public class BJ_1935 {
	public static void main(String[] args) throws NumberFormatException, IOException {
		BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
		
		int N = Integer.parseInt(br.readLine());
		String postfix = br.readLine();
		int[] numbers = new int[N];
		for (int i = 0; i < N; i++) {
			numbers[i] = Integer.parseInt(br.readLine());
		}
		
        // 후위 표기식 계산할 스택
        Stack<Double> stack = new Stack<>();
        
        for (char ch : postfix.toCharArray()) {
            if (Character.isLetter(ch)) {
                // 문자면 대응하는 값 넣음
                stack.push((double) numbers[ch - 'A']);
            } else {
                // 연산자면 스택에서 두 개 값 꺼내서 계산, 결과는 다시 스택에 넣음
                double b = stack.pop();
                double a = stack.pop();
                switch (ch) {
                    case '+':
                        stack.push(a + b);
                        break;
                    case '-':
                        stack.push(a - b);
                        break;
                    case '*':
                        stack.push(a * b);
                        break;
                    case '/':
                        stack.push(a / b);
                        break;
                }
            }
        }
        
        // 결과 꺼내기
        double result = stack.pop();
        System.out.println(String.format("%.2f", result));
	}
}

 

오예~~~