1181 : 단어정렬

서희찬·2021년 9월 12일
0

백준

목록 보기
24/105

문제

코드


#include <stdio.h>
#include <stdlib.h>
#include <string.h>

typedef struct _Strings
{
    char english[50]; // 영어 문자열
    int length;
    
}String;

void MergeTwoArea(String arr[],int left, int mid, int right);
void MergeSort(String*arr,int left,int right);


int main(void)
{
    int num;
    
    scanf("%d",&num);
    
    //구조체 동적할당
    String*arr =(String*)malloc(sizeof(String)*num);
    
    //입력받기
    for(int i=0;i<num;i++)
    {
        scanf("%s",arr[i].english);

        //문자열 길이 저장
        arr[i].length = strlen(arr[i].english);
    }
    //정렬
    MergeSort(arr, 0, num-1);
    
    //출력
    for(int i=0;i<num;i++)
    {
        if(i==0)
            printf("%s\n",arr[i].english);
        else
        {
            if(strcmp(arr[i].english, arr[i-1].english)!=0) //이전요소랑 비교해서 strcmp가 0이아니면 출력
                printf("%s\n",arr[i].english);
        }
        
    }
    
    //동적할당 해제
    free(arr);
    return 0;
}

void MergeTwoArea(String*arr,int left, int mid, int right)
{
    int fIdx = left;
    int rIdx = mid + 1;
    int i;

    String * sortArr = (String*)malloc(sizeof(String)*(right+1)); // 임시 구조체 배열 생성
    int sIdx = left;

    while(fIdx<=mid && rIdx <= right)
    {
        if(arr[fIdx].length<arr[rIdx].length)
            sortArr[sIdx] = arr[fIdx++];
        else if(arr[fIdx].length>arr[rIdx].length)
            sortArr[sIdx] = arr[rIdx++];
        else //길이가 같을때
        {
            
            if(strcmp(arr[fIdx].english,arr[rIdx].english)<0)
                sortArr[sIdx] = arr[fIdx++];
            else
                sortArr[sIdx] = arr[rIdx++];
        }
        sIdx++;
    }

    if(fIdx>mid)
    {
        for(i=rIdx;i<=right;i++,sIdx++)
            sortArr[sIdx]=arr[i];
    }
    else
    {
        for(i=fIdx;i<=mid;i++,sIdx++)
            sortArr[sIdx]=arr[i];
    }
    for(i=left;i<=right;i++)
        arr[i] = sortArr[i];

    free(sortArr); //해제
}


void MergeSort(String*arr,int left,int right)
{
    int mid;

    if(left<right)
    {
        //check mid
        mid = (left+right)/2;

        // Divide
        MergeSort(arr, left, mid);
        MergeSort(arr, mid+1, right);

        //Merge
        MergeTwoArea(arr, left, mid, right);
    }
}

해설

문자의길이를 우선적으로 비교해서 정렬하고 같은길이의 문자열을 가졌으면 사전순으로 출력해야하는 문제이다.
구조체로 문자열을 저장하고, 문자열의 길이를 저장할 수 있게 만들었다.

병합정렬!을 또 이용해서!! 문자열길이기준으로 정렬해주는 과정을 거쳤다..!
그 후 출력할때는 strcmp를 이용해서 같은 문자를 가진것은 하나만 출력하게 만들었다 !!

strcmp(const char str1,const char str2)

str1,2앞에 *이 있어야한당
입력이 안되네 짜증나게 ㅎㅎ

이 함수는 문자열 str1,str2를 비교해주는 함수이다.
같다면 0을 출력하고 다르다면 아스키코드값에 따라 -1또는 1을 출력한다

str1 < str2 : 음수출력 
str1 = str2 : 0출력
str1 > str2 : 양수출력 

이 함수가 핵심쓰~!
이거랑... 또합정렬ㅋㅋ...

profile
부족한 실력을 엉덩이 힘으로 채워나가는 개발자 서희찬입니다 :)

0개의 댓글