-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy path4949 stack
87 lines (83 loc) · 1.91 KB
/
4949 stack
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
// baekjoon 4949. 균형잡힌 세상
// 단계별로 풀어보기: 스택, 큐, 덱
//스택 구현 방식: '('와 '['만 스택에 저장 후 ')' 또는 ']'를 만났을 경우 최상위 스택 문자와 비교. 짝이 맞으면 pop, 틀리면 "no" 출력.
#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
int main() {
char ch[101], stk[101]; //ch: 문자 받는 배열, stk: stack
int a, i = 0, s = -1; //a: getchar 함수에 쓸 변수, i: 문자열 길이, s: 스택 인덱스
int cmp = 0, c = 0; //cmp: 중복으로 출력하지 않기 위한 확인 변수, c: '.' 하나만 들어와 프로그램이 모두 완료되었음을 확인하기 위한 변
while (c == 0) {
while (1) {
a = getchar();
ch[i] = a;
i++;
if (a == '.') {
break;
}
}
// getchar(); 쓸 때 두번 째 문장부터 ' '(공백)이 앞에 붙던데 이유를 정확히 찾진 못함(3월 9일 기준). 백준 기준 정답이지만 처음에 '.'이 오면 틀림. 이를 고치기 위해 while 문 밑에 getchar 함수 따로 하나 적는게 더 정확할 듯.
if (i == 2 && ch[1] == '.') {
c = 1;
break;
}
for (int k = 0;k < i;k++) {
if (ch[k] == '(') {
s++;
stk[s] = ch[k];
}
else if (ch[k] == ')') {
if (s < 0) {
printf("no\n");
cmp = 1;
break;
}
else {
if (stk[s] == '(') {
s--;
}
else if (stk[s] == '[') {
printf("no\n");
cmp = 1;
break;
}
}
}
else if (ch[k] == '[') {
s++;
stk[s] = ch[k];
}
else if (ch[k] == ']') {
if (s < 0) {
printf("no\n");
cmp = 1;
break;
}
else {
if (stk[s] == '[') {
s--;
}
else if (stk[s] == '(') {
printf("no\n");
cmp = 1;
break;
}
}
}
}
if (c == 1) {
break;
}
if (cmp == 0) {
if (s != -1) {
printf("no\n");
}
else {
printf("yes\n");
}
}
cmp = 0;
s = -1;
i = 0;
}
}