문제
알파벳 소문자로 이루어진 N개의 단어가 들어오면 아래와 같은 조건에 따라 정렬하는 프로그램을 작성하시오.
- 길이가 짧은 것부터
- 길이가 같으면 사전 순으로
입력
첫째 줄에 점의 개수 N (1 ≤ N ≤ 100,000)이 주어진다. 둘째 줄부터 N개의 줄에는 i번점의 위치 xi와 yi가 주어진다. (-100,000 ≤ xi, yi ≤ 100,000) 좌표는 항상 정수이고, 위치가 같은 두 점은 없다.
출력
조건에 따라 정렬하여 단어들을 출력한다. 단, 같은 단어가 여러 번 입력된 경우에는 한 번씩만 출력한다.
예시
입력 출력 13
but
i
wont
hesitate
no
more
no
more
it
cannot
wait
im
yoursi
im
it
no
but
more
wait
wont
yours
cannot
hesitate
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
typedef struct {
int length;
char text[51];
} word;
int compare(const void *a, const void *b) {
word A = *(word *)a;
word B = *(word *)b;
if (A.length > B.length) {
return 1;
}
else if (A.length < B.length) {
return -1;
}
return strcmp(A.text, B.text);
}
int main() {
int N;
scanf("%d", &N);
word arr[N];
for (int i = 0; i < N; i++) {
scanf("%s", arr[i].text);
arr[i].length = strlen(arr[i].text);
}
qsort(arr, N, sizeof(word), compare);
printf("%s\n", arr[0].text);
for (int i = 1; i < N; i++) {
if (strcmp(arr[i - 1].text, arr[i].text)) {
printf("%s\n", arr[i].text);
}
}
return 0;
}
배운 점
퀵정렬 함수는 좌표 정렬하기, 나이순 정렬 문제에서 다뤄서 패턴이 익숙해졌다.
이번 문제에서 strcmp
함수에 대해 알게 되었다.
이 전에는 문자열을 비교할 때 for문
을 돌렸지만 시간이 오래 걸리고 코드가 너무 길어지는 문제점이 생겼다.
strcmp
함수는 퀵정렬 함수와 반환값이 동일하다.
반환값 | 설명 |
---|---|
-1 | a < b |
0 | a = b |
1 | a > b |
간과한 점
동일한 문자열이 존재할 경우, 하나만 출력해야한다.
이때도 strcmp
를 사용하면 간단하게 해결할 수 있다.
strcmp(이전 문자열, 현재 문자열)
의 반환값이 0
이라면 존재하지 않는 것이기 때문에 결과가 출력되지 않는다.