입력 코드
#include <stdio.h>
#define MAXSIZE 50
int main() {
int i, j, cnt, num;
char arr[MAXSIZE];
scanf("%d", &num);
for (j = 0; j < num; j++) {
cnt = 0;
scanf("%s", arr);
for (i = 0; i < MAXSIZE; i++) {
if (arr[i] == '\0')
break;
if (arr[i] == '(')
cnt++;
else if (arr[i] == ')' && cnt > 0)
cnt--;
else if (arr[i] == ')' && cnt <= 0) {
cnt--;
break;
}
}
if (cnt == 0)
printf("YES\n");
else
printf("NO\n");
}
}
출처 jwprogramming.tistory.com/137
코드 설명
#자료구조 #문자열 #스택
#include <stdio.h>
main() {
int T;
scanf("%d", &T);
int i;
char s[52];
int right = 0, left = 0;
for (i = 0; i < T; i++) {
scanf("%s", &s);
if (s[i] == "(")
left++;
else
right++;
if (left == right)
printf("YES\n");
else
printf("NO\n");
}
}
처음에는 '(' 와 ')' 의 개수가 똑같으면 괄호의 모양이 바르게 구성된 문자열을 올바른 괄호 문자열(Valid PS, VPS)일 거라 생각했지만,
예제2의 세 번째 문자열에서 NO가 출력되어 아닌 것임을 알 수 있다.
#include <stdio.h>
char stack[50];
int top = 0;
int isVPS(char *);
void push(char);
char pop();
int isEmpty();
main() {
int t;
char str[51];
int i;
scanf("%d", &t);
for (i = 0; i < t; i++) {
scanf("%s", str);
if (isVPS(str))
printf("YES\n");
else
printf("NO\n");
}
return 0;
}
int isVPS(char *str) {
int result = 1;
int i;
for (i = 0; str[i]; i++) {
if (str[i] == '(') {
push(str[i]);
}
else {
if (isEmpty()) {
result = 0;
break;
}
else
pop();
}
}
if (!isEmpty())
result = 0;
while (!isEmpty()) {
pop();
}
return result;
}
void push(char c) {
stack[top++] = c;
}
char pop() {
return stack[--top];
}
int isEmpty() {
return top == 0;
}
문제 출처
'C' 카테고리의 다른 글
#59. [백준_C언어] 10816 : 숫자 카드 2 (0) | 2021.02.01 |
---|---|
#58. [백준_C언어] 10814 : 나이순 정렬 (0) | 2021.01.30 |
#56. [백준_C언어] 2751 : 수 정렬하기 2 (0) | 2021.01.29 |
#55. [백준_C언어] 2609 : 최대공약수와 최소공배수 (0) | 2021.01.29 |
#54. [백준_C언어] 2164 : 카드2 (0) | 2021.01.28 |