반응형

문제 출처 :


https://www.acmicpc.net/problem/8979



알고리즘 분석 :


문제 해결에 필요한 사항

1. 정렬

2. 시뮬레이션


정렬 알고리즘 및 순위 표현하는 과정을 잘 표현하면 쉽게 해결할 수 있는 문제이다.


필자는 문제를 제대로 읽지 않아 4번의 WA를 받았는데


k번째 순위가 아닌 k국가의 순위임을 명심하고 풀면 좋을 것 같다.


정렬 알고리즘은 comp 함수 내에서 설명되어있지만,


금, 은, 동 순서이니 그에 맞게 if문을 써서 순서대로 정렬 될 수 있도록 해주면 된다.





소스 코드 : 


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
#include <iostream>
#include <cstdio>
#include <algorithm>
 
using namespace std;
 
typedef struct _INFO_
{
    int nation;
    int gold;
    int silver;
    int bronze;
    int rank;
}INFO;
 
INFO arr[1001];
 
bool comp(INFO const &a, INFO const &b)
{
    if (a.gold > b.gold)
        return a.gold > b.gold;
 
    else if (a.gold == b.gold && a.silver > b.silver)
        return a.silver > b.silver;
 
    else if (a.gold == b.gold && a.silver == b.silver && a.bronze > b.bronze)
        return a.bronze > b.bronze;
 
    return false;
}
int main()
{
    int n, k;
 
    scanf("%d %d"&n, &k);
 
    for (int i = 0; i < n; i++)
        scanf("%d %d %d %d"&arr[i].nation, &arr[i].gold, &arr[i].silver, &arr[i].bronze);
 
    sort(arr, arr + n, comp);
 
    int rank = 1;
 
    int gold = arr[0].gold;
    int silver = arr[0].silver;
    int bronze = arr[0].bronze;
 
    arr[0].rank = rank;
 
    for (int i = 0; i < n; i++)
    {
        if (arr[i].gold == gold && arr[i].silver == silver && arr[i].bronze == bronze)
        {
            while (arr[i].gold == gold && arr[i].silver == silver && arr[i].bronze == bronze)
            {
                arr[i].rank = rank;
                i++;
            }
            rank = i + 1;
            i--;
        }
        else
        {
            gold = arr[i].gold;
            silver = arr[i].silver;
            bronze = arr[i].bronze;
            while (arr[i].gold == gold && arr[i].silver == silver && arr[i].bronze == bronze)
            {
                arr[i].rank = rank;
                i++;
            }
            rank = i + 1;
            i--;
        }
        
    }
 
    for(int i = ; i < n; i ++)
        if(arr[i].nation == k)
            cout << arr[i].rank;
 
    return 0;
}
 
//                                                       This source code Copyright belongs to Crocus
//                                                        If you want to see more? click here >>
Crocus


반응형

'Applied > 알고리즘 문제풀이' 카테고리의 다른 글

[3048번] 개미  (0) 2017.04.13
[11404번] 플로이드  (2) 2017.04.12
[10868번] 최소값  (0) 2017.04.12
[2414번] 게시판 구멍 막기  (0) 2017.04.12
[1867번] 돌멩이 제거  (0) 2017.04.12