1181
1181번 문제#include
#include // strcmp, strlen 함수
#include // qsort
#define MAX 2000
#define MAXLINE 50
int cmp(const void *, const void *); //qsort 함수를 사용하기 위하여 정의한 함수
int main(void) {
int n, i ; // i : 배열의 인덱스, n : 단어의 개수
char arr[MAX+1][MAXLINE+1]; // 입력 받는 배열
scanf("%d", &n);
for (i = 0 ; i < n; i++) // 배열 입력 받기
scanf("%s", arr[i]);
qsort(arr, n, sizeof(arr[0]), cmp); // quick sort 실행하기
printf("*********\n");
for (i = 0; i < n; i++) {
if (!strcmp(arr[i], arr[i + 1])) { // 만약 같은 수가 출력된다면 출력하지 말 것
continue;
}
else {
printf("%s\n", arr[i]);
}
}
}
int cmp(const void * a, const void * b) {
int n1 = strlen(a);
int n2 = strlen(b);
if (n1 > n2)
return 1;
else if (n2 > n1)
return -1;
else {
return strcmp(a, b);
}
}
// 나중에 기회가 된다면 이 방법으로도 풀어볼 것
for (i = 0; i < n - 1; i++) { // 크기대로 배열
for (j = 0; j < n - 1 - i; j++) {
if (len[j] > len[j + 1]) {
temp = len[j];
len[j] = len[j + 1];
len[j + 1] = temp;
strcpy(temps, arr[j]);
strcpy(arr[j], arr[j + 1]);
strcpy(arr[j + 1], temps);
}
}
}
for (i = 0; i < n - 1; i++) { // 사전 순으로 배열
if (len[i] == len[i + 1]) {
if (len[i + c] == len[i + c + 1])
c++;
else {
for (j = i; j < i + c; j++) {
for (k = i; k < i + c - j; k++) {
if (strcmp(arr[k], arr[k - 1]) < 0) {
strcpy(temps, arr[k]);
strcpy(arr[k], arr[k - 1]);
strcpy(arr[k - 1], temps);
}
}
}
}
}
}
결과
처음에는 개수 별로 한 번, 같은 개수내에서 사전 순으로 한 번 정렬하여 출력하려고 했다. 개수 별로 정렬하는 것은 이전에 문제들과 다를 바 없었지만, 같은 개수 내에서 사전 순으로 정렬하는 것은 꽤나 복잡했다. 결국 라이브러리 함수인 qsort를 찾아서 정렬하니 이전에 방법과 달리 간편하게 한 번에 정렬할 수 있었다.
+) qsort 사용법 strcmp 사용법
'문제풀이 > C 문제풀이' 카테고리의 다른 글
[Hackerrank]Compare the Triplets (0) | 2019.05.17 |
---|---|
[HackerRank]Simple Array Sum (0) | 2019.05.17 |
1427 (0) | 2019.03.01 |
2108 (0) | 2019.03.01 |
10989 (0) | 2019.03.01 |