본문 바로가기

문제풀이/C 문제풀이

1181

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);
						}
					}
				}
			}
		}

	}

결과

1181.png

처음에는 개수 별로 한 번, 같은 개수내에서 사전 순으로 한 번 정렬하여 출력하려고 했다. 개수 별로 정렬하는 것은 이전에 문제들과 다를 바 없었지만, 같은 개수 내에서 사전 순으로 정렬하는 것은 꽤나 복잡했다. 결국 라이브러리 함수인 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