Notice
Recent Posts
Recent Comments
Link
«   2024/12   »
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
Tags
more
Archives
Today
Total
관리 메뉴

아무거나 내꺼 공부할래

올바른 괄호(stack) / c / 제한시간 없음 본문

[c언어&c++] 알고리즘 공부/인프런(Inflearn)

올바른 괄호(stack) / c / 제한시간 없음

mero95 2021. 2. 1. 14:54

▣ 문제

괄호가 입력되면 올바른 괄호이면 “YES", 올바르지 않으면 ”NO"를 출력합니다. (())() 이것은 괄호의 쌍이 올바르게 위치하는 거지만, (()()))은 올바른 괄호가 아니다.

 

▣ 입력설명

- 첫 번째 줄에 괄호 문자열이 입력됩니다. 문자열의 최대 길이는 30이다.

 

▣ 출력설명

- 첫 번째 줄에 YES, NO를 출력한다.

 

▣ 입력 예시

(()(()))(()
()()(()()) 

▣ 출력 예시

NO
YES

 

<내 코드>

#pragma warning(disable:4996)
#include <stdio.h>

int stack[30];
int top = -1;

void push(int x) {
	stack[++top] = x;
}

void pop() {
	stack[top--];
}

int main() {
	char str[30];
	scanf("%s", str);
	for (int i = 0; str[i] != '\0'; i++) {
		if (str[i] == ')') {
			pop();
			if (top < -1) {
				printf("NO\n");
				return 0;
			}
		}
		else {
			push(1);
		}
	}
	if (top == -1) {
		printf("YES\n");
		return 0;
	}
	printf("NO\n");
	return 0;
}

'(' 가 나오면 push, ')' 가 나오면 pop을 해준다.

 

for 문 중간에 ')'이 더 많이 나오거나 먼저 나오면 올바른 괄호가 되지 않기 때문에 top > -1 이란 조건문을 사용했다.

 

for 문이 다 돌고 stack이 비어있으면 올바른 괄호이고 '(' 이 남아있다면 잘못된 괄호이다.

 

.

 

c++에서는 .empty() 같은 내장 함수가 많아서 바로 쓸수 있지만

 

c에는 empty함수를 선언하고 직접 만들어서 짜야함

 

좀 더 체계적으로 짜려면 empty같은 함수를 위에 선언하고 하는게 나을듯