정렬 19

[백준 2108] 통계학 [C]

풀이 최빈값을 구하는게 조금 까다로웠다. int mode = arr[0], cnt = 1, temp_cnt, temp; for (int i = 1; i cnt){ mode = arr[i]; temp_cnt = 0; }else if (temp_cnt == cnt) temp = arr[i]; if (arr[i] == mode) cnt++; else if (arr[i] != arr[i-1]) temp_cnt = 0; else temp_cnt++; } 이후 mode와 temp 중 큰 값을 출력하는 방식으로 Test Case 예제는 통과했으나, 결과는 틀린것으로 나왔다. 때문에 이번 문제는 평범하게 -4000 ~ 4000의 범위에 해당하는 배열을 이용해 풀이했다. -..

[백준 2750] 수 정렬하기 [C]

풀이 처음에는 입력받은 숫자에 해당하는 배열을 1로 초기화한 후 출력해주는 방법으로 접근했으나, 시작부터 틀렸다. #include #define MAX 1001 int main(){ int N, num, arr[MAX] = {0, }; scanf("%d", &N); while (N--){ scanf("%d", &num); arr[num-1] = 1; } for (int i = 0; i < MAX; i++) if (arr[i]) printf("%d\n", i + 1); } 아마도, "수의 절대값이 1,000보다 작거나 같은 정수"라는게 양수가 아닌, 음수 또한 입력되는 것으로 추측되기 때문에 틀린 것 같다. Insertion Sort를 사용해 해결했다. 소스코드 #include int main() { in..

[백준 10989] 수 정렬하기 3 [C]

풀이 "수 정렬하기 2"와는 반대로 시간효율보다 공간효율이 중시되는 문제이기 때문에 동일한 코드를 사용하면 틀릴 것 이다. 그래서, 주어지는 숫자의 개수를 배열에 저장 후, 각 숫자의 개수만큼 반복해서 출력하는 방법으로 해결했다. 소스코드 #include #define MAX 10000 int main(){ int N, num, cnt[MAX] = {0, }; scanf("%d", &N); while (N--){ scanf("%d", &num); cnt[num-1]++; } for (int i = 0; i < MAX; i++) if (cnt[i] != 0) for (int j = 0; j < cnt[i]; j++) printf("%d\n", i + 1); } 출처 10989번: 수 정렬하기 3 첫째 줄에..

[백준 11651] 좌표 정렬하기 2 [C]

풀이 좌표 정렬하기 1에서는 x를 우선으로 오름차순 정렬 후, x의 값이 동일할 때 y의 값으로 오름차순 정렬했지만, 이번 문제에서는 반대로 y를 오름차순 정렬 후, 동일값일때 x를 기준으로 오름차순 정렬하면 해결할 수 있다. 소스코드 #include #include typedef struct{ int x, y; }Point; int compare(const void *a, const void *b){ Point p1 = *(Point*)a, p2 = *(Point*)b; if (p1.y p2.y) return 1; else { if (p1.x p2.x) return 1; retu..

[백준 11650] 좌표 정렬하기 [C]

풀이 x를 기준으로 오름차순으로 정렬하는데, 만약 x의 값이 동일하다면 y의 값을 기준으로 오름차순으로 정렬하면된다. 소스코드 #include #include typedef struct{ int x, y; }Point; int compare(const void *a, const void *b){ Point p1 = *(Point*)a, p2 = *(Point*)b; if (p1.x p2.x) return 1; else { if (p1.y p2.y) return 1; return 0; } } int main(){ int N; scanf("%d", &N); Point p[N]; for..

[백준 2751] 수 정렬하기 2 [C]

풀이 시간 제한이 2초라, 공간효율보다는 시간효율을 중시해 코드를 작성했다. 소스코드 #include #include int num[1000001]; int compare(const void *a, const void *b){ int n1 = *(int *)a, n2 = *(int *)b; if (n1 n2) return 1; return 0; } int main(){ int N; scanf("%d", &N); for (int i = 0; i < N; i++) scanf("%d", &num[i]); qsort(num, N, sizeof(int), compare); for (int i = 0; i < N; i++) printf("%d\n", num[i..

[백준 1181] 단어 정렬 [C]

풀이 문자열과 문자열의 길이를 구조체 배열로 저장해주고, Quick Sort를 사용해 길이에 따라 오름차순 정렬 후, 길이가 같을 때는 strcmp()로 문자열을 비교해 문자열이 크고 작은지에 따라 정렬해준다. 문자열을 비교해 동일한 문자열을 가지는 구조체가 없을때만 출력해준다. 소스코드 #include #include #include typedef struct { char str[51]; int len; }Str; int compare(const void *a, const void *b){ Str s1 = *(Str*)a, s2 = *(Str*)b; if (s1.len s2.len) return 1; return strcmp(s1.s..

[백준 10814] 나이순 정렬 [C]

풀이 나이와 이름을 등록할 수 있는 구조체를 만들어 사용하자. 나이가 같을 경우 등록된 순서대로 출력을 해주어야 하기 때문에 다음과 같은 방법을 생각해 볼 수 있다. 구조체 내부에 order변수를 선언해서 등록 순서를 입력 조금은 복잡하지만 구조체 배열의 인덱스를 활용하여 메모리를 절약 등록순서 1 2 3 4 5 6 7 " " 나이 20 21 20 23 21 20 23 " " 하지만, 나이를 고려하지 않을 경우 이미 등록 순서는 오름차순으로 정렬되있다, 때문에 추가로 정렬을 해주지 않고, 가장 적은 나이에서 가장 많은 나이까지 분류를 하여 출력해주는 방식으로 해결했다. 등록순서 1 3 6 나이 20 20 20 등록순서 2 5 나이 21 21 등록순서 4 7 나이 23 23 소스코드 #include #in..