반응형
문제 출처 :
https://www.acmicpc.net/problem/2910
알고리즘 분석 :
문제 해결에 필요한 사항
1. 구조체 배열
2. 정렬 방식
일단 예제 입력처럼 구조체 배열 중 값에 해당하는 부분에 입력값을 받아들이고,
그다음 구조체를 카운트 해주는 부분에 같은 값이 있으면 cnt를 ++해주는 형식으로 for문을 한번 돌린다.
그다음 카운트가 1이상인 아이들을 tmp구조체 배열에 모두 다 넣고 버블정렬로 num에 대해 정렬하여 출력한다.
값을 받고 -> 값이 몇개있는지 정렬하지 않은 채 카운트를 확인하고 -> 카운트에 대해 정렬하고 -> 출력하는것이 핵심이다.
이때 버블정렬을 쓴 이유는, 최악의 상황이 어디까지인지 확인 해 보고싶었기에 버블 정렬을 이용해 보았고,
stable sort 혹은 std::sort , quick sort 등등으로도 해결이 모두 가능하다.
참고내용
Stable Sorting ::
둘 이상의 키로 이루어진 데이터를 정렬 할 때 정렬 대상 이외의 값들은 위치를 유지하는 것이 Stable Sorting이다.
퀵 정렬
정렬 기준이 맨 처음 원소라면 stable하다.
그렇지 않다면? 정렬 기준과 원래 원소의 위치를 고려해야 한다.
버블 정렬
stable
삽입 정렬
stable
병합 정렬
stable
힙 정렬
stable 하지 않다.
순서 정보가 힙에 들어가는 과정에서 파괴됨
소스 코드 :
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 | #include <iostream> #include <algorithm> #include <stdio.h> using namespace std; struct _map { long long int num; int cnt; }; bool comp_m(_map const &a, _map const &b) { return a.cnt > b.cnt; } _map m[1001]; _map tmp[1001]; long long int c, val; void BubbleSort(_map arr[], int n) { int i, j; int temp; for (i = 0; i < n - 1; i++) { for (j = 0; j < (n - i) - 1; j++) { if (arr[j].cnt < arr[j + 1].cnt) { temp = arr[j].cnt; arr[j].cnt = arr[j + 1].cnt; arr[j + 1].cnt = temp; temp = arr[j].num; arr[j].num = arr[j + 1].num; arr[j + 1].num = temp; } } } } int main() { int n, j = 0, k = 0; scanf("%d %lld", &n, &c); // 초기화 for (int i = 0; i < n; i++) { m[i].num = 0; m[i].cnt = 0; tmp[i].num = 0; tmp[i].cnt = 0; } for (int i = 0; i < n; i++) { scanf("%lld", &val); m[i].num = val; // 같은 넘버 있으면 그넘버 cnt++ for (j = 0; j <= i; j++) { if (m[j].num == m[i].num) { m[j].cnt++; break; } } } j = 0; for (int i = 0; i < n; i++) { if (m[i].cnt != 0) { tmp[j].num = m[i].num; tmp[j].cnt = m[i].cnt; j++; } } BubbleSort(tmp, j); // tmp 배열의 cnt가 0이 될때까지 계속 출력 for (int i = 0; i < j; i++) { while (tmp[i].cnt > 0) { tmp[i].cnt--; printf("%lld ", tmp[i].num); } } return 0; } // This source code Copyright belongs to Crocus // If you want to see more? click here >> | Crocus |
반응형
'Applied > 알고리즘 문제풀이' 카테고리의 다른 글
[2875번] 대회 or 인턴 (0) | 2016.10.24 |
---|---|
[2193번] 이친수 (0) | 2016.10.14 |
[1463번] 1로 만들기 (Dynamic Programming) (2) | 2016.10.04 |
[11899번] 괄호 끼워넣기 (0) | 2016.10.02 |
[2559번] 수열 (0) | 2016.09.30 |