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에 들어가게 만들었으므로 따로 손 볼 필요가없다 !
그저 앞서 짠 병합배열을 가져와서 변수이름만 바꾸어줬다,,!
#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]이라고해서...
젠쟝...범위 조심하자..!
Author And Source
이 문제에 관하여(10814 : 나이순 정렬), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://velog.io/@seochan99/10814-나이순-정렬저자 귀속: 원작자 정보가 원작자 URL에 포함되어 있으며 저작권은 원작자 소유입니다.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)