반응형
이전 괄호문제(9012번)에서 발전된 유형문제.
이전에 두가지 방법으로 풀었는데, 첫번째 풀이로는 어려울 듯 해서 두 번째 풀이로 진행했다.
정말 많이 틀렸다. 모든게 문제를 제대로 읽지 못한 것에서 비롯되었다.
내가 계속 캐치해내지 못했던 부분은.. 솔직히 말하면 좀 애매하다. 문제에서 조금 더 정확히 알려줬다면 좋았을 텐데.. 문제도 어느정도 잘못이 있다고 말하고 싶다 ㅜ
문자열을 입력받을 때, 최대 길이가 100이라고 안내해주었다. 그리고 문자열의 종료 조건으로 마지막에 . 을 넣어준다고 했다.
그러면 당연히 .이 포함된 문자열 최대 길이가 100인줄 알았는데 .는 별개였다..
즉, 입력받을 char 배열의 크기는 '문자열(100) + .(1) + 널문자(1) = 102 여야 한다.
어쨌든,, 이것만 주의하면 되고!! 문제를 풀어나가는 방향은 이전 9012번과 비슷하겠지만
소괄호와 중괄호를 구분하여 스택에 넣어주고 ( 저 같은 경우는 1과 2로 구분 )
pop 할때, top이 현재 pop하려는 괄호와 일치하는지 체크해나가면서
일치하면 pop, 일치하지 않으면 조건에 충족되지 않는 경우라고 보면 된다.
왜냐하면
Help( I[m being held prisoner in a fortune cookie factory)].
경우, 둘의 짝이 맞아보이지만 ( [ ) ] 이므로, 짝이 맞지 않는게 사실이다.
코드
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
typedef struct {
int *stk;
int size;
}IntStack;
void push(IntStack *s, int a) {
s->stk[s->size++] = a;
}
int pop(IntStack *s, int a) {
// 같은 종류가 맨 위에 있다면
if(a == s->stk[s->size - 1]) {
s->size--;
return 1; // 성공
}
return 0; // 실패
}
int N;
char str[102];
// 소괄호 1, 중괄호 2
int main() {
int i;
IntStack stack;
stack.size = 0;
stack.stk = calloc(102, sizeof(int));
while(1) {
fgets(str, 102, stdin);
if(str[0] == '.') // 종료조건.
return 0;
stack.size = 0; // 매번 초기화
for(i = 0; i < strlen(str); i++) {
if(str[i] == '(') {
push(&stack, 1);
} else if(str[i] == ')') {
if(pop(&stack, 1))
;
else // 짝이 안맞는다면
break;
} else if(str[i] == '[') {
push(&stack, 2);
} else if(str[i] == ']') {
if(pop(&stack, 2))
;
else
break;
}
}
// 끝까지 안돌았거나, 스택에 무언가 들어있거나.
if(strlen(str) != i || stack.size != 0)
printf("no\n");
else
printf("yes\n");
}
}
반응형
'[백준]' 카테고리의 다른 글
[BaekJoon/백준] 17298 스택 활용 (0) | 2021.03.07 |
---|---|
[BaekJoon/백준] 1874번 스택 활용 (0) | 2021.03.06 |
[BaekJoon/백준] 9012번 스택 활용 (2) | 2021.03.05 |
[BaekJoon/백준] 10773번 스택 (0) | 2021.03.05 |
[BaekJoon/백준] 10828 스택 구현 (0) | 2021.03.05 |