본문 바로가기
[C++] 알고리즘 교육/11~13. 자료구조

[알고리즘 11.3.4] 스택 - 괄호의 값

by 안산학생 2019. 4. 24.

문제


4개의 기호 ‘(’, ‘)’, ‘[’, ‘]’를 이용해서 만들어지는 괄호열 중에서 올바른 괄호열이란 다음과 같이 정의된다. 한 쌍의 괄호로만 이루어진 ‘()’와 ‘[]’는 올바른 괄호열이다. 만일 X가 올바른 괄호열이면 ‘(X)’이나 ‘[X]’도 모두 올바른 괄호열이 된다. X와 Y 모두 올바른 괄호열이라면 이들을 결합한 XY도 올바른 괄호열이 된다. 예를 들어 ‘(()[[]])’나 ‘(())[][]’ 는 올바른 괄호열이지만 ‘([)]’ 나 ‘(()()[]’ 은 모두 올바른 괄호열이 아니다. 우리는 어떤 올바른 괄호열 X에 대하여 그 괄호열의 값(괄호값)을 아래와 같이 정의하고 값(X)로 표시한다.

  1. ‘()’ 인 괄호열의 값은 2이다.
  2. ‘[]’ 인 괄호열의 값은 3이다.
  3. ‘(X)’ 의 괄호값은 2×값(X) 으로 계산된다.
  4. ‘[X]’ 의 괄호값은 3×값(X) 으로 계산된다.
  5. 올바른 괄호열 X와 Y가 결합된 XY의 괄호값은 값(XY)= 값(X)+값(Y) 로 계산된다.

예를 들어 ‘(()[[]])([])’ 의 괄호값을 구해보자. ‘()[[]]’ 의 괄호값이 2 + 3×3=11 이므로 ‘(()[[ ]])’의 괄호값은 2×11=22 이다. 그리고 ‘([])’의 값은 2×3=6 이므로 전체 괄호열의 값은 22 + 6 = 28 이다. 여러분이 풀어야 할 문제는 주어진 괄호열을 읽고 그 괄호값을 앞에서 정의한대로 계산하여 출력하는 것이다.

 

입력


첫째 줄에 괄호열을 나타내는 문자열(스트링)이 주어진다. 단 그 길이는 1 이상, 30 이하이다.  

출력


첫째 줄에 그 괄호열의 값을 나타내는 정수를 출력한다. 만일 입력이 올바르지 못한 괄호열이면 반드시 0을 출력해야 한다.

 

예제 입력

(()[[]])([])

예제 출력

28

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

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
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
#include <stdio.h>
#include <string.h>
 
const int MAX = 10000;
 
struct stack{
    
    int arr[MAX];
    int capacity=0;
    int len=0;
    
    void create(int y){
        capacity = y;
        len = 0;
    }
    
    void push(int y){
        if(len >= capacity){
            printf("stack overflow\n");
        }else{
            arr[len++= y;
        }
    }
    
    void pop(){
        if(len <= 0){
            printf("stack underflow\n");
        }else{
            arr[len-1= NULL;
            len--;
        }
    }
    
    //탑 반환. 
    int top(){
        //스택에 아무것도 없을 때. 
        if(len <= 0 || arr[len-1]==NULL){
            return 0;
        }else{
        //스택에 무언가 있을 때.  
            return arr[len-1];
        }
    }
    
    int stackSum(){
        int sum = 0;
        for(int i=0; i<len; i++){
            sum += arr[i];
        }
        return sum;
    }
    
    void stackPrint(){
        for(int i=0; i<len; i++){
            printf("%d ",arr[i]);
        }
    }
    
};
 
int main(){
    
    stack s;
    s.create(35);
    
    char input[35];
    fgets(input, 35, stdin);
    
    //스택에서 뽑아온 값 임시 저장 변수. 
    int temp;
    
    int sum = 0
    int plusSum = 0;
    
    for(int i=0; i<strlen(input)-1; i++){
        if(input[i]=='('){
            s.push(-1);
        }else if(input[i]=='['){
            s.push(-2);
        }else if(input[i]==')'){
 
            plusSum = 0;
            while(true){
                temp = s.top();
                if(temp == -1 ){
                    s.pop();
                    if(plusSum != 0){
                        s.push(plusSum*2);
                    }else{
                        s.push(2);    
                    }
                    break;
                }else if(temp == -2){
                    printf("0\n");
                    return 0;
                }else{
                    s.pop();
                    plusSum += temp;
                }
            }
            
        }else if(input[i]==']'){
            
            plusSum = 0;
            while(true){
                temp = s.top();
                if(temp == -2 ){
                    s.pop();
                    if(plusSum != 0){
                        s.push(plusSum*3);
                    }else{
                        s.push(3);    
                    }
                    break;
                }else if(temp == -1){
                    printf("0\n");
                    return 0;
                }else{
                    s.pop();
                    plusSum += temp;
                }
            }
            
        }
    }
    
    
    int result = s.stackSum();
    printf("%d\n",result);
    
    //s.stackPrint();
    
    
    return 0;
}
 

댓글