한다 공부
[C] 스택 : 백준 알고리즘 9012번 괄호 본문
스택 하는김에 하나 더 해봤다.
"맞았습니다" 뜨는게 상당히 기쁘다 ^^
이 맛에 코딩하남
괄호를 검사하기위해 check_vps 라는 함수를 만들었다.
리턴값이 1이면 yes를 (메인에서) 출력하도록
리턴값이 0이면 no를 출력하도록 했다.
check_vps에서는 문자열의 길이만큼 반복을 하고
' ( ' 를 만나면 push ' ) ' 를 만나면 pop,
빈 상태에서 ' ) ' 를 만나면 return 0,
문자열을 다 돌았는데 스택에 뭔가 남아있으면 return 0
정도를 구현했다
#include <stdio.h>
#include<stdlib.h>
#include<string.h>
typedef char element;
typedef struct {
element data[50];
int top;
}StackType;
void init_stack(StackType* s) {
s->top = -1;
}
void push(StackType* s, element item) {
s->top++;
s->data[s->top] = item;
}
element pop(StackType* s) {
int item;
item = s->data[s->top];
s->top--;
return item;
}
int check_vps(const char *vps) {
StackType s;
init_stack(&s);
int len = strlen(vps); //괄호의 길이
int i;
for (i = 0; i < len; i++) {
if (vps[i] == '(')
push(&s, vps[i]);
else if (vps[i] == ')') {
if (s.top == -1)
return 0;
pop(&s);
}
else
return 0;
}
if (s.top != -1) return 0;
return 1;
}
int main() {
char vps[50];
int count,i;
scanf("%d", &count);
for (i = 0; i < count; i++) {
scanf("%s", vps);
if (check_vps(vps) == 1)
printf("YES\n");
else
printf("NO\n");
}
}
나름 맞았다고 생각했는데 첫 시도에서
"틀렸습니다" 가 나와서 당황했다
근데 이거 어느 부분에서 구멍난건지 도통 안알려줘서 힘듦 ㅠ
놓친부분은 check_vps에서 스택이 비어있을 때
' ) '를 만나면 NO가 떠야하는데
그 경우의 수를 고려를 못했었다
if문 두줄 달아주니 맞았습니다 라고 뜨는데 희열 ~
이번에는 아예 빈 스택인지 검사하는 함수를 하나 만드는게 나았을거같다는 생각이 들었다.
저의 영혼의 교재 <C 언어로 쉽게 풀어 쓴 자료구조, 생능출판, 천인국 공용해 하상호>를 참고했습니다.
'Algorithm > 문제풀이' 카테고리의 다른 글
[C++] 백준 알고리즘 10757번 큰 수 A+B (0) | 2021.09.12 |
---|---|
[C++] 백준 알고리즘 11651번 좌표 정렬하기 2 (0) | 2021.09.09 |
[C++] 백준 알고리즘 1431번 시리얼 번호 (0) | 2021.09.09 |
[C++] 백준 알고리즘 1316번 그룹 단어 체커 (0) | 2021.09.09 |
[C] 큐 : 백준 알고리즘 2164번 카드2 (0) | 2021.07.15 |