#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를 이용해서 같은 문자를 가진것은 하나만 출력하게 만들었다 !!
str1,2앞에 *이 있어야한당
입력이 안되네 짜증나게 ㅎㅎ
이 함수는 문자열 str1,str2를 비교해주는 함수이다.
같다면 0을 출력하고 다르다면 아스키코드값에 따라 -1또는 1을 출력한다
str1 < str2 : 음수출력 str1 = str2 : 0출력 str1 > str2 : 양수출력
이 함수가 핵심쓰~!
이거랑... 또합정렬ㅋㅋ...