1223 계산기 2

2020. 1. 30. 17:28Learn/Algorithm

후위연산식으로 바꾸고

다시 후위연산식을 계산하는 계산기를 만드는 문제.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
import java.util.Scanner;
import java.util.Stack;
 
public class Solution {
    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        
        for(int t = 0; t < 10; t++) {    
            Stack st = new Stack();
            Stack st2 = new Stack();
            String result = "";
            int awwer = sc.nextInt();
            sc.nextLine();
            String[] str = sc.nextLine().split("");
            char[] stack = new char[20];
            int top = -1;
            
            for (int i = 0; i < str.length; i++) {
                char c = str[i].charAt(0);
                switch(c) { // int형 범위 이하의 정수 or String 문자열
                case '(' : // 스택에 무조건 넣는다
                    stack[++top] = c;
                    break;
                case '*'// 스택에 2보다 작은 우선순위가 있을 때까지 꺼내서 출력
                case '/':
                    while(top >= 0 && (stack[top] == '*'|| stack[top] == '/')) {
                        result += stack[top--];
                        
                    }
                    stack[++top] = c;
                    break;
                case '+'// 스택에 1보다 작은 우선순위가 있을 때까지 꺼내서 출력
                case '-':
                    while(top >= 0 && (stack[top] == '+' || stack[top] == '-' || stack[top] == '*'|| stack[top] == '/')) {
    
                        result += stack[top--];
                    }
                    stack[++top] = c;
                    break;
                case ')'// ( 여는 괄호가 나올 때까지 모두 빼서 출력
                    while(top >= 0 && stack[top] != '(') {
    
                        result += stack[top--];
                    }
                    if(top >= 0 && stack[top] == '(') { // ( 괄호가 반드시 있겠지만, 확인해줌
                         top--;
                    }
                    break;
                default : // 피연산자 (숫자)
                    result+= str[i];
                    break;
                }
            }
            
            while(top > -1) { // 스택에 남아있는 연산자를 출력
    
                result += stack[top--]; 
                
            }
    
            StringBuilder sbb = new StringBuilder(result);
            for(int i = 0; i < sbb.length(); i++) {
                if'0' <= sbb.charAt(i) && sbb.charAt(i) <= '9')
                    st.push(sbb.charAt(i));
                
                else if(sbb.charAt(i) == '+' || sbb.charAt(i) == '-') {
                    
                    int b = Integer.parseInt(st.peek().toString());
                    st.pop();
                    int a = Integer.parseInt(st.peek().toString());
                    st.pop();
                    if(sbb.charAt(i) == '+')
                        st.push(a+b);
                    if(sbb.charAt(i) == '-')
                        st.push(a-b);
                }
                else if(sbb.charAt(i) == '*' || sbb.charAt(i) == '/') {
                    
                    int b = Integer.parseInt(st.peek().toString());
                    st.pop();
                    int a = Integer.parseInt(st.peek().toString());
                    st.pop();
                    if(sbb.charAt(i) == '*')
                        st.push(a*b);
                    if(sbb.charAt(i) == '/')
                        st.push(a/b);
                }
            }
            System.out.println("#" + (t+1+ " " + st.peek());
        }
    }
}
 
cs

'Learn > Algorithm' 카테고리의 다른 글

552 : 반복제어문3 - 자가진단5  (0) 2020.01.31
1209. [S/W 문제해결 기본] 2일차 - Sum  (0) 2020.01.31
1175 주사위던지기2  (0) 2020.01.30
1169 주사위던지기1  (0) 2020.01.30
2007. 패턴 마디의 길이  (0) 2020.01.29