Bakejoon/Silver

[C언어] 백준 20291번 : 파일정리 <Silver 3>

chattymin 2022. 2. 19. 19:57
728x90

⚠️ 내맘대로 작성한 코드이기 때문에 비합리적 진행과 근거없는 추론이 있을 수 있습니다 ⚠️

 

문제 링크 : https://www.acmicpc.net/problem/20291

 

20291번: 파일 정리

친구로부터 노트북을 중고로 산 스브러스는 노트북을 켜자마자 경악할 수밖에 없었다. 바탕화면에 온갖 파일들이 정리도 안 된 채 가득했기 때문이다. 그리고 화면의 구석에서 친구의 메시지를

www.acmicpc.net

Code


#include <stdio.h>

#include <string.h>

#include <stdlib.h>

 

// qsort를 위한 compare함수

int compare(const void *a, const void *b)

{

    return strcmp((char *)a, (char *)b);

}

 

int main() {

    char result[50000][101]; // 확장자 기록 배열

    int outputN[50000] = { 0, }; // 각 확장자별 갯수 기록 배열

    int num = 0; // 입력값

    char string[101]; // 파일명 입력 배열

    char *ptr; // 확장자 분리용

    int cnt = 0; // 확장자의 갯수 카운트

    

    scanf("%d", &num);

    

    // 배열 입력 및 확장자 분리

    for (int i = 0; i < num; i++){

        scanf("%s", string);

        ptr = strtok(string, ".");

        ptr = strtok(NULL, ".");

        strcpy(result[i], ptr);

    }

    

    // 확장자를 사전 순서로 정렬

    qsort(result, num, sizeof(result[0]), compare);

    

    

    // 배열속 확장자의 갯수 카운트 및 결과 출력

    for(int i = 0; i < num; i++){

        if(strcmp(result[i],result[i+1]) == 0){

            outputN[cnt]++;

        }

        else if(strcmp(result[i],result[i+1]) != 0){

            printf("%s %d\n", result[i], outputN[cnt] + 1);

            cnt++;

        }

    }

    

    return 0;

}


Code 필수 요소

1. "."을 기준으로 확장자를 분리할 strtok의 사용및 사용법

2. 확장자를 사전순으로 정렬하기 위한 sort의 사용및 사용법

 

이것만 생각해내면 절반은 끝났다.

 

// 배열 입력 및 확장자 분리

파일의 이름을 입력받고, strtok를 이용해서 "." 이후의 확장자만 분리하여 2차원 배열에 바로 넣어준다.

 

// 확장자를 알파벳 순서로 정렬

퀵정렬을 이용해서 입력받은 모든 확장자를 사전순서로 정렬해준다.

 

// 배열속 확장자의 갯수 카운트 및 결과 출력

연속된 확장자를 비교하여 같을경우 해당 확장자의 갯수에 해당하는 배열의 값을 늘려준다.

앞의 확장자와 뒤의 확장자가 다를 경우 해당 확장자의 총 갯수가 끝났다고 판단, 해당 확장자와 그 갯수를 출력한다.

 

 

끝나고 보니까 확장자의 갯수에 해당하는 값을 배열이 아니라 int변수 하나만 쓰고 초기화하면서 쓰는게 나았을거같다.

 

 

-끝-

728x90