입력 코드
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
typedef struct {
char string[51];
int length;
} str;
str sort[20001];
void merge(str* arr, int first, int mid, int last) {
int i = first;
int j = mid + 1;
int k = first;
while(i <= mid && j <= last) {
if (arr[i].length < arr[j].length) {
sort[k++] = arr[i++];
} else if (arr[i].length > arr[j].length) {
sort[k++] = arr[j++];
} else {
if (strcmp(arr[i].string, arr[j].string) < 0) {
sort[k++] = arr[i++];
}
else {
sort[k++] = arr[j++];
}
}
}
if (i > mid) {
while (j <= last)
sort[k++] = arr[j++];
}
else {
while (i <= mid)
sort[k++] = arr[i++];
}
for (k = first; k <= last; k++)
arr[k] = sort[k];
}
void mergesort(str* arr, int first, int last) {
int mid;
if (first < last) {
mid = (first + last) / 2;
mergesort(arr, first, mid);
mergesort(arr, mid + 1, last);
merge(arr, first, mid, last);
}
}
int main(void)
{
int N;
scanf("%d", &N);
str arr[N];
for(int i = 0; i < N; i++) {
scanf("%s", arr[i].string);
arr[i].length = strlen(arr[i].string);
}
mergesort(arr, 0, N - 1);
printf("%s\n", arr[0].string);
for (int i = 1; i < N; i++) {
if (strcmp(arr[i-1].string, arr[i].string) != 0)
printf("%s\n", arr[i].string);
}
return 0;
}
코드 설명
#정렬 #문자열
정렬 알고리즘을 이용해서 문자열 길이를 비교하고, 문자열 길이가 같을 때에는 사전식 배열을 해야 하는데
정렬 알고리즘 중에서 뭘 사용해야 할지도 뭐가 있는지도 모르겠고, 어떤 라이브러리를 추가해야 할지도 모르겠다.
그래서 우선 참고할 만한 링크들만 걸어놓고 개념부터 정리하고 나중에 다시 풀어야겠다.
합병 정렬
gmlwjd9405.github.io/2018/05/08/algorithm-merge-sort.html
[알고리즘] 합병 정렬(merge sort)이란 - Heee's Development Blog
Step by step goes a long way.
gmlwjd9405.github.io
↓↓↓ 참고한 사이트
blog.naver.com/vjhh0712v/221466947001
백준 알고리즘 1181번 문제풀이
단어 정렬 문제알파벳 소문자로 이루어진 N개의 단어가 들어오면 아래와 같은 조건에 따라 정렬하는 프...
blog.naver.com
daydreamx.tistory.com/entry/baekjoon1181
[C] 백준 1181번: merge sort 구현하기
📎 백준 1181번 풀러 가기 1181번: 단어 정렬 첫째 줄에 단어의 개수 N이 주어진다. (1≤N≤20,000) 둘째 줄부터 N개의 줄에 걸쳐 알파벳 소문자로 이루어진 단어가 한 줄에 하나씩 주어진다. 주어지는
daydreamx.tistory.com
[백준 1181] 단어 정렬
C언어를 이용하여 코드를 작성하였다. 처음 코드에는 정렬을 할 때, O(n^2)인 정렬을 써서 시간 초과가 나서 검색해보니 stdlib.h 파일에서 제공하는 qsort()라는 함수를 발견하여 qsort()함수를 이용하
h32j00.tistory.com
문제 출처
1181번: 단어 정렬
첫째 줄에 단어의 개수 N이 주어진다. (1 ≤ N ≤ 20,000) 둘째 줄부터 N개의 줄에 걸쳐 알파벳 소문자로 이루어진 단어가 한 줄에 하나씩 주어진다. 주어지는 문자열의 길이는 50을 넘지 않는다.
www.acmicpc.net
'C' 카테고리의 다른 글
#53. [백준_C언어] 1978 : 소수 찾기 (0) | 2021.01.28 |
---|---|
#52. [백준_C언어] 1920 : 수 찾기 (0) | 2021.01.27 |
#50. [백준_C언어] 1018 : 체스판 다시 칠하기 (0) | 2021.01.26 |
#49. [백준_C언어] 2740 : 행렬 곱셈 (0) | 2021.01.26 |
#48. [백준_C언어] 5086 : 배수와 약수 (0) | 2021.01.25 |