어흥

[백준 8978] 올림픽 (C++) 본문

알고리즘/백준

[백준 8978] 올림픽 (C++)

라이언납시오 2020. 3. 6. 21:06
728x90
반응형

문제 링크: https://www.acmicpc.net/problem/8979

 

8979번: 올림픽

입력의 첫 줄은 국가의 수 N(1 ≤ N ≤ 1,000)과 등수를 알고 싶은 국가 K(1 ≤ K ≤ N)가 빈칸을 사이에 두고 주어진다. 각 국가는 1부터 N 사이의 정수로 표현된다. 이후 N개의 각 줄에는 차례대로 각 국가를 나타내는 정수와 이 국가가 얻은 금, 은, 동메달의 수가 빈칸을 사이에 두고 주어진다. 전체 메달 수의 총합은 1,000,000 이하이다.

www.acmicpc.net

1. 주의할 점

- 전체 메달 수의 총합이 100만이다. -> 금 X M+ 은 X M + 동 X M (M은 특정 수)로 하기엔 M을 쉽게 생각하지 못했다

- 찾고자 하는 index에 집중하지 말고 해당 index의 금은동 갯수에 집중한다.

 

2. 구현

- 첫 번째 방식:  금은동을 전부 String으로 바꾼후, Map을 이용해서 구현하려고 했다. (실패)

  =>금 2 은 22 동 2 와 금22 은 2 동 2 와 같은 케이스에 대한 예외처리가 까다롭다

- 두 번째 방식: 우선순위큐를 사용한다 (성공)

  => 찾고자 하는 금은동 각각의 갯수와 같다면 while문에서 빠져 나오고, 그렇지 않다면 cnt를 1씩 더하면서 찾는다

 

#include <iostream>
#include <queue>
#include <algorithm>
#include <map>
#include <string>
using namespace std;

struct info {
	int gold, silver, bronze;
};
info tmp;
struct cmp{
	bool operator()(info &a, info &b) {
		if (a.gold == b.gold) {
			if (a.silver == b.silver) 
				return a.bronze < b.bronze;			
			return a.silver < b.silver;
		}
		return a.gold < b.gold;
	}
};
int main() {
	int country, idx, g, s, b, tidx, tg, ts, tb;
	cin >> country >> tidx;
	priority_queue<info, vector<info>, cmp> pq;
	for (int i = 0; i < country; i++) {
		cin >> idx >> g >> s >> b;
		if (idx == tidx) { tg = g; ts = s; tb = b; }
		tmp.bronze = b;
		tmp.silver = s;
		tmp.gold = g;
		pq.push(tmp);
	}
	int cnt = 1;
	while (!pq.empty()) {
		int cg = pq.top().gold;
		int cs = pq.top().silver;
		int cb = pq.top().bronze;
		pq.pop();
		if (tg == cg && ts == cs && tb == cb) 	break;	
		else	cnt++;
	}
	cout << cnt;
	system("pause");
	return 0;
}

 

 

 

728x90
반응형

'알고리즘 > 백준' 카테고리의 다른 글

[백준 17073] 나무 위의 빗물 (C++)  (0) 2020.03.07
[백준 11437] LCA (C++)  (0) 2020.03.07
[백준 9205] 맥주 마시면서 걸어가기 (C++)  (0) 2020.03.06
[백준 14502] 연구소 (C++)  (0) 2020.03.06
[백준 5214] 환승 (C++)  (0) 2020.03.06
Comments