본문 바로가기
Problem Solving/SWEA

SWEA- 1233 계산기 2

by 채니_ 2021. 2. 7.

<후위표기식> STACK이용

 

연산자마다 우선순위를 부여해주어야함.

내 연산순위> 스택의 peek연산순위 = push.

내 연산순위<= 스택의 peek 연산순위 = pop후 문자열에 붙이기 and 나를 push.

후위 표기 연산이 이해가 잘 가지않아 그림을 그려보았다.

과정이 두개 필요하다

1. 후위표기식을 만들기

2. 후위표기연산을 하기


import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.util.Scanner;
import java.util.Stack;

public class Solution{
	static int oson(char c) {
		if(c=='*') return 10;
		else if(c=='+') return 5;
		return -1;
	}
	public static void main(String[] args) throws FileNotFoundException {
		System.setIn(new FileInputStream("input/swea_Cal2.txt"));
		Scanner sc = new Scanner(System.in);
		for (int tc = 1; tc <= 10; tc++) {
			int N = sc.nextInt();
			String str = sc.next();
			String cal ="";
			Stack<Character> stk = new Stack<Character>();
			for (int i = 0; i < str.length(); i++) {
				char c = str.charAt(i);
				//숫자일경우 문자열에 붙이기
				if(c-'0'>=0 && c-'0'<=9) {
					cal += String.valueOf(c);
				}
				//문자일경우(*, +일경우 스택이 비었나 확인 ->스택에 넣어야하기때문)
				else {
					if(stk.isEmpty()) {
						stk.push(c);
					}
					else {
						if(oson(stk.peek()) < oson(c)) {
							stk.push(c);
						}
						else {
							
							cal += String.valueOf(stk.pop());
							stk.push(c);
						}
					}
				}
			}
			while(!stk.isEmpty()) {
				cal += String.valueOf(stk.pop());
			}
			//후위표기식을 계산
			Stack <Integer> sk = new Stack<Integer>();
			
			for (int i = 0; i < cal.length(); i++) {
				char c = cal.charAt(i);
				//숫자이면 무조건 푸시
				if(c-'0'>=0 && c-'0'<=9) {
					sk.push(c-'0');
				}else{
				//* 이나 + 이면 2번 팝 계산후 푸시
				int num1=sk.pop();
				int num2=sk.pop();
				if(c=='*') {
					sk.push(num1*num2);
				}else if(c=='+') {
					sk.push(num1+num2);
				}
				}
				
			}
			int res = sk.pop();
			System.out.printf("#%d %d\n",tc,res);
		}
	
	
	}
}

'Problem Solving > SWEA' 카테고리의 다른 글

SWEA-1220 Magnetic  (0) 2021.02.13
SWEA- 9229 한빈이와 Spot Mart  (0) 2021.02.08
SWEA -1861 정사각형 방  (0) 2021.02.07
SWEA- 5432 쇠막대기 자르기  (0) 2021.02.06
SWEA- 5215 햄버거 다이어트  (0) 2021.02.06

댓글