1181: 단어 정렬

2022. 5. 1. 00:45C언어/백준

-Class2 : Silver 5

https://www.acmicpc.net/problem/1181

 

1181번: 단어 정렬

첫째 줄에 단어의 개수 N이 주어진다. (1 ≤ N ≤ 20,000) 둘째 줄부터 N개의 줄에 걸쳐 알파벳 소문자로 이루어진 단어가 한 줄에 하나씩 주어진다. 주어지는 문자열의 길이는 50을 넘지 않는다.

www.acmicpc.net

 

-결과

 

-코드

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

typedef struct {
	int len;
	char str[51];
}Word;

void merge(Word list[], int left, int mid, int right)
{
	Word* tmp_list;
	int i, j, k;

	tmp_list = (Word*)calloc(right + 1, sizeof(Word)); 

	i = k = left;
	j = mid + 1;

	while (i <= mid && j <= right)
	{
		if (list[i].len < list[j].len)
			tmp_list[k++] = list[i++];
		else if (list[j].len < list[i].len)
			tmp_list[k++] = list[j++];
		else 
		{
			if (strcmp(list[i].str, list[j].str) < 0)
				tmp_list[k++] = list[i++];
			else
				tmp_list[k++] = list[j++];
		}

	}
	while (i <= mid)
	{
		tmp_list[k++] = list[i++];
	}
	while (j <= right)
	{
		tmp_list[k++] = list[j++];
	}

	for (k = left; k <= right; k++)
	{
		list[k] = tmp_list[k];
	}

	free(tmp_list);
}

void merge_sort(Word list[], int left, int right)
{
	if (left < right)
	{
		int mid = (left + right) / 2;
		merge_sort(list, left, mid);
		merge_sort(list, mid + 1, right);
		merge(list, left, mid, right);
	}
}

int main()
{
	int i, j, n;
	Word* text;

	scanf("%d", &n);

	text = (Word*)calloc(n + 1, sizeof(Word));

	for (i = 0; i < n; i++)
	{
		scanf(" %s", text[i].str);
		text[i].len = strlen(text[i].str);

		for (j = 0; j < i; j++)
		{
			if (strcmp(text[i].str, text[j].str) == 0) 
			{
				i -= 1;
				n -= 1;
				break;
			}
		}
	}

	merge_sort(text, 0, n - 1);

	for (i = 0; i < n; i++)
	{
		printf("%s\n", text[i].str);
	}

	return 0;
}

 

-풀이

이 문제는 시간 복잡도가 O(n log n)인 merge sort로 푸는 문제이다.

우선 임시로 배열을 할당하여 단어들을 저장한 후에, if - else문을 이용하여 길이가 작은 단어부터 긴 단어 순으로 정렬하도록 하고, 만약 길이가 같은 단어들의 경우에는 사전순으로 정렬하도록 작성한다.

main 함수에는 for문을 사용하여 만약 같은 단어가 반복되는 경우에는 중복을 피하게끔 작성한다.

'C언어 > 백준' 카테고리의 다른 글

2609: 최대공약수와 최소공배수  (0) 2022.05.05
1436: 영화감독 숌  (0) 2022.05.01
1018: 체스판 다시 칠하기  (0) 2022.05.01
10773: 제로  (0) 2022.04.03
9012: 괄호  (0) 2022.04.03