반응형

@notepad_jj2

츄르사려고 코딩하는 코집사입니다.


1. [SW expert Academy] SWEA 1223번 계산기2 자바(Java)

1) 난이도 : D4

 

2) 문제번호 : 1223번

 

3) 문제 출처

swexpertacademy.com/main/code/problem/problemDetail.do?contestProbId=AV14nnAaAFACFAYD

 

SW Expert Academy

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

swexpertacademy.com

 

2. 문제

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

예를 들어

“3+4+5*6+7”

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

"34+56*+7+"

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

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

3. 제약사항

-

 

4. 입력

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

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

 

5. 출력

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

6. 풀이

- 중위식을 먼저 후위식으로 변환한다.

- 변환된 후위식을 가지고 계산을 하는데, 피연산자가 나오면 스택에 넣고, 연산자가 나오면 피연산자 2개를 pop()하여 계산한 결과를 다시 stack에 push한다.

- 마지막에 들어 있는 스택의 값이 결과가 된다.

- 이 문제를 푸는데 1시간이 넘게 걸렸는데, 중위식에서 후위식으로 변환된 식을 사용해야 하는데 자꾸 중위식을 가져와서 EmptyStack이 떴다.

7. 소스 코드

import java.util.*;

public class Solution {
	public static void main(String[] args) {
		Scanner sc = new Scanner(System.in);
		Stack<Character> op = new Stack<>();
		Stack<Integer> numStack = new Stack<>();
		
		for(int tc=1;tc<=10;tc++) {
			// 테스트 케이스 길이 입력
			int T = sc.nextInt();
			
			// 계산식
			String a = sc.next();
			
			// 후위식 저장
			String hu = "";
			
			//전위식을 후위식으로 변환
			for (int i = 0; i < a.length(); i++) {
				char c = a.charAt(i);
				
				//char형이 숫자면 후위식에 다 넣기
				if (0 <= c-'0' && c-'0' <= 9) hu += c;
				
				//숫자가 아니면 
				else {
					//*이면
					if(c=='*') op.push(c);
					
					//*이 아니면
					else {
						while(!op.isEmpty() && (op.peek()=='*' || op.peek()=='+')) {
							hu += op.pop();
						}
						op.push(c);
					}
				}
			}

			//나머지 연산자 출력
			while(!op.empty()) hu+=op.pop();			
			
			//후위식 계산
			for(int i =0;i<T;i++) {
				char c = hu.charAt(i);
				
				//숫자면 numStack에 push
				if (0 <= c-'0' && c-'0' <= 9) {
					numStack.push(c-'0');
				}
				 
				//연산자면 2개를 pop해서 계산 후 다시 numStack에 push
				else {
					int num1 = numStack.pop();
					int num2 = numStack.pop(); //여기서 EmptyStackException이 일어남.
//					
					if(c == '*') numStack.push(num1*num2);
					else if(c == '+') numStack.push(num1+num2);
				}
			}
			System.out.printf("#%d %d\n",tc,numStack.pop());
		}
	}
}

 

반응형
  • 네이버 블러그 공유하기
  • 네이버 밴드에 공유하기
  • 페이스북 공유하기
  • 카카오스토리 공유하기