반응형
츄르사려고 코딩하는 코집사입니다.
1. [SW expert Academy] SWEA 1223번 계산기2 자바(Java)
1) 난이도 : D4
2) 문제번호 : 1223번
3) 문제 출처
swexpertacademy.com/main/code/problem/problemDetail.do?contestProbId=AV14nnAaAFACFAYD
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());
}
}
}
반응형
'알고리즘 > SW expert Academy' 카테고리의 다른 글
[SW expert Academy] SWEA 1940번 가랏! RC카! 자바(Java) (0) | 2021.02.09 |
---|---|
[SW expert Academy] SWEA 9229번 한빈이와 Spot Mart 자바(Java) (0) | 2021.02.09 |
[SW expert Academy] SWEA 1228번 암호문1 자바(Java) (0) | 2021.02.08 |
[SW expert Academy] SWEA 1979번 어디에 단어가 들어갈 수 있을까 자바(Java) (0) | 2021.02.07 |
[SW expert Academy] SWEA 1959번 두 개의 숫자열 자바(Java) (0) | 2021.02.05 |
[SW expert Academy] SWEA 1989번 초심자의 회문 검사 자바(Java) (0) | 2021.02.05 |
[SW expert Academy] SWEA 1948번 날짜 계산기 자바(Java) (0) | 2021.02.05 |
[SW expert Academy] SWEA 2007번 패턴 마디의 길이 자바(Java) (2) | 2021.02.05 |
최근댓글