
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#define MAX_WORDS 20000
#define MAX_LENGTH 51
int compare(const void* a, const void* b) {
char* word1 = *(char**)a;
char* word2 = *(char**)b;
int len1 = strlen(word1);
int len2 = strlen(word2);
if (len1 != len2) {
return len1 - len2;
}
return strcmp(word1, word2);
}
int main() {
int N;
scanf("%d", &N);
char* words[MAX_WORDS];
for (int i = 0; i < N; i++) {
words[i] = (char*)malloc(MAX_LENGTH * sizeof(char));
scanf("%s", words[i]);
}
qsort(words, N, sizeof(char*), compare);
printf("%s\n", words[0]);
for (int i = 1; i < N; i++) {
if (strcmp(words[i], words[i - 1]) != 0) {
printf("%s\n", words[i]);
}
}
for (int i = 0; i < N; i++) {
free(words[i]);
}
return 0;
}
풀이
첫 줄에서 단어의 개수를 입력받고 각 단어를 words 배열에 저장함 malloc으로 동적 할당
compare: 두 단어의 길이를 먼저 비교하고 길이가 같으면 사전 순으로 비교
정렬된 첫 번째 단어는 바로 출력하고 그 후로는 바로 앞의 단어와 비교하여 중복이 아닌 경우에만 출력해 중복을 제거함

#include <stdio.h>
#include <string.h>
int isVPS(char* ps) {
int stack = 0;
for (int i = 0; i < strlen(ps); i++) {
if (ps[i] == '(') {
stack++;
} else {
stack--;
}
if (stack < 0) {
return 0; // NO
}
}
return stack == 0;
}
int main() {
int T;
scanf("%d", &T);
for (int i = 0; i < T; i++) {
char ps[51];
scanf("%s", ps);
if (isVPS(ps)) {
printf("YES\n");
} else {
printf("NO\n");
}
}
return 0;
}
(면 스택에 넣고 )가 나오면 스택에서 하나를 꺼냄
만약 스택에 (가 있는 상태로 끝이 나거나 스택이 비어있는데 )가 등장하면 VPS가 아님
isVPS: 괄호 문자열이 VPS인지 확인하는 함수
(가 오면 stack을 1 증가시키고 )는 1 감소시킨다
도중에 stack이 음수가 되면(스택이 비었는데 )가 오는 경우) VPS가 아니므로 NO를 반환
테스트 케이스 수를 입력받아 for문 돌며
괄호 문자열을 입력받음 isVPS 함수로 해당 문자열이 VPS인지 확인하고 결과 출력