9/29

chi·2024년 9월 29일

백준

목록 보기
20/20

1181

#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: 두 단어의 길이를 먼저 비교하고 길이가 같으면 사전 순으로 비교
정렬된 첫 번째 단어는 바로 출력하고 그 후로는 바로 앞의 단어와 비교하여 중복이 아닌 경우에만 출력해 중복을 제거함

9012

#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인지 확인하고 결과 출력

0개의 댓글