728x90
시간 제한 : 1초
메모리 제한 : 128MB
입력
입력의 첫 줄은 국가의 수 N(1 ≤ N ≤ 1,000)과 등수를 알고 싶은 국가 K(1 ≤ K ≤ N)가 빈칸을 사이에 두고 주어진다. 각 국가는 1부터 N 사이의 정수로 표현된다. 이후 N개의 각 줄에는 차례대로 각 국가를 나타내는 정수와 이 국가가 얻은 금, 은, 동메달의 수가 빈칸을 사이에 두고 주어진다. 전체 메달 수의 총합은 1,000,000 이하이다.
출력
출력은 단 한 줄이며, 입력받은 국가 K의 등수를 하나의 정수로 출력한다. 등수는 반드시 문제에서 정의된 방식을 따라야 한다.
소스코드
#include <iostream> #include <algorithm> using namespace std; struct nation { int id, gold, silver, bronze, rank; }; bool compare(struct nation a, struct nation b) { if (a.gold > b.gold) return true; else if (a.gold == b.gold) { if (a.silver > b.silver) return true; else if (a.silver == b.silver) { return a.bronze > b.bronze ? true : false; } else return false; } else return false; } int main(void) { int n, k, rank = 1, idx = 0; struct nation arr[1000]; cin >> n >> k; for (int i = 0; i < n; i++) cin >> arr[i].id >> arr[i].gold >> arr[i].silver >> arr[i].bronze; sort(arr, arr + n, compare); arr[0].rank = rank; for (int i = 0; i < n; i++) { if (arr[i].gold == arr[idx].gold && arr[i].silver == arr[idx].silver && arr[i].bronze == arr[idx].bronze); else idx = i; while (arr[i].gold == arr[idx].gold && arr[i].silver == arr[idx].silver && arr[i].bronze == arr[idx].bronze) { arr[i].rank = rank; i++; } rank = i + 1; i--; } for(int i=0;i<n;i++) if (arr[i].id == k) cout << arr[i].rank; }
Tip
제시된 방법으로 정렬해주고 메달의 숫자가 완전히 동일한 경우에 대해서 적절히 처리해주어야 한다.
728x90
'Computer Science > Algorithm Problem' 카테고리의 다른 글
백준] 10158 - 개미(KOI 2014 지역본선) (0) | 2018.02.21 |
---|---|
백준] 2631 - 줄세우기(KOI 2001) (0) | 2018.02.18 |
백준] 8974 - 희주의 수학시험 (0) | 2018.02.07 |
백준] 5554 - 심부름 가는 길(JOI 2011 예선) (0) | 2018.02.05 |
백준] 1551 - 수열의 변화 (0) | 2018.02.04 |