[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같은 함수를 위에 선언하고 하는게 나을듯