본문 바로가기

swea

계산기2-1223번(Java)

728x90

https://swexpertacademy.com/main/talk/solvingClub/problemView.do?solveclubId=AXqfDPHqMxwDFAV2&contestProbId=AV14nnAaAFACFAYD&probBoxId=AXthGkOqeNcDFAVy&type=PROBLEM&problemBoxTitle=20210820&problemBoxCnt=2 

 

SW Expert Academy

SW 프로그래밍 역량 강화에 도움이 되는 다양한 학습 컨텐츠를 확인하세요!

swexpertacademy.com

문자열로 이루어진 계산식이 주어질 때, 이 계산식을 후위 표기식으로 바꾸어 계산하는 프로그램을 작성하시오.

예를 들어

“3+4+5*6+7”

라는 문자열로 된 계산식을 후위 표기식으로 바꾸면 다음과 같다.

"34+56*+7+"

변환된 식을 계산하면 44를 얻을 수 있다.

문자열 계산식을 구성하는 연산자는 +, * 두 종류이며 피연산자인 숫자는 0 ~ 9의 정수만 주어진다.

[입력]

각 테스트 케이스의 첫 번째 줄에는 테스트 케이스의 길이가 주어진다. 그 다음 줄에 바로 테스트 케이스가 주어진다.

총 10개의 테스트 케이스가 주어진다.

[출력]

#부호와 함께 테스트 케이스의 번호를 출력하고, 공백 문자 후 답을 출력한다.

입력101
9+5*2+1+3*3*7*6*9*1*7+1+8*6+6*1*1*5*2*4*7+4*3*8*2*6+7*8*4*5+3+7+2+6+5+1+7+6+7*3*6+2+6+6*2+4+2*2+4*9*3
79
4+4*3*4*9+2+7*4*7+7*7*9*5*2+8*8+2*6*7*3*7*9*3*4+8+8*9+3+9+6+9+4*1+6*3+5+1+7+5*1
...

 

출력

#1 28134
#2 195767
...

package a0820;

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

public class Solution_1223_계산기_서울_12반_이서영 {

	static int n;

	public static void main(String[] args) throws NumberFormatException, IOException {
		int T=10;
		BufferedReader br = new BufferedReader(new InputStreamReader(new FileInputStream("res/1223_input.txt")));
		for(int tc = 1; tc <= T; tc++)
		{
			n = Integer.parseInt(br.readLine());
			Stack<Character>st = new Stack<>();
			String str = br.readLine();
			String nstr = "";
			for(int i=0; i<n; i++) {
				
				char c = str.charAt(i);
				if(c=='*'|| c=='/'||c=='+'||c=='-') {
					if(st.isEmpty()) {
						st.push(c);
						continue;
					}
					
					if(c=='*'||c=='/') {
						
						while(true) {
							
							if(st.isEmpty()) {break;}
							
							char nc = st.peek();
							
							if(nc=='*'||nc=='/') {
								nstr+=st.pop();
							}
							else {
								break;
							}
						}
						st.push(c);
						
					}
					else {
						while(true) {
							if(st.isEmpty()) {break;}
							
							nstr+=st.pop();
						}
						st.push(c);
					}
				}
				else {
					nstr+=c;
				}
			}
			
			while(!st.isEmpty()) {
				nstr+=st.pop();
			}
			
			int a =0;
			int b =0;
			
			Stack<Integer>nst = new Stack<>();
			
			for(int i=0; i<n; i++) {
				char c = nstr.charAt(i);
				if(c=='*'|| c=='/'||c=='+'||c=='-') {
					
					a = nst.pop();
					b = nst.pop();
					
					if(c=='*'){
						nst.push(a*b);
					}
					else if(c=='/') {
						nst.push(a/b);
					}
					else if(c=='+') {
						nst.push(a+b);
					}
					else {
						nst.push(a-b);
					}
					
				}
				else {
					
					nst.add(c-'0');
					
				}
				
				
				
			}
			
			System.out.println("#"+tc+" "+nst.pop());
			
		}
		
		
	}
}

'swea' 카테고리의 다른 글

파핑파핑지뢰찾기  (0) 2021.10.02
3307. 최장증가부분수열 (LIS)  (0) 2021.09.16
4012.요리사  (0) 2021.08.22
정올- 1828.냉장고  (0) 2021.08.22
6808번. 규영이와인영이의카드게임  (0) 2021.08.15