반응형

문제 출처 :


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