관리 메뉴

한다 공부

[C] 스택 : 백준 알고리즘 9012번 괄호 본문

Algorithm/문제풀이

[C] 스택 : 백준 알고리즘 9012번 괄호

사과당근 2021. 7. 11. 05:50

스택 하는김에 하나 더 해봤다.
"맞았습니다" 뜨는게 상당히 기쁘다 ^^
이 맛에 코딩하남

백준 알고리즘 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 언어로 쉽게 풀어 쓴 자료구조, 생능출판, 천인국 공용해 하상호>를 참고했습니다.