10814 : 나이순 정렬

문제

코드


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

typedef struct _Strings
{
    char name[102]; // 영어 문자열
    int age;
    
}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("%d %s",&arr[i].age,arr[i].name);
    //정렬
    MergeSort(arr, 0, num-1);
    
    //출력
    for(int i=0;i<num;i++)
    {
        printf("%d %s\n",arr[i].age,arr[i].name);
        
    }
    
    //동적할당 해제
    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].age<=arr[rIdx].age)
            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);
    }
}

해설

또합정렬 !
나중에 시간되면 다른 정렬도 사용해봐야징..
그냥 간단한 문제다
나이순을 먼저고려하고 가입순서를 고려하면 되는데
가입순서는 그저 먼저 입력받은 값이니깐 먼저 입력받은 값이 먼저 sortArr에 들어가게 만들었으므로 따로 손 볼 필요가없다 !
그저 앞서 짠 병합배열을 가져와서 변수이름만 바꾸어줬다,,!

그런데 !!!
제출하니 실패라고 떠서 띠용해서 보니 char name[100]이라고해서...
젠쟝...범위 조심하자..!

좋은 웹페이지 즐겨찾기