본문 바로가기

PS/BaekJoon

[C++/5766] 할아버지는 유명해!


 단순히 기록용 입니다... 어떻게 풀었는가 생각도 다시 해보고 그러니까 아마도 도움은 안되실 것 같습니다.



할아버지께서 가장 많은 포인트를 얻어서 최고의 브릿지 선수로 선정되었습니다. 랭킹에 선수의 이름이 오를 때마다 선수의 포인트가 1포인트씩 오른다고 합니다.

할아버지는 2등이 누군지 궁금해졌는데? N주동안 M명의 랭킹을 보여주게 되는데, M명의 랭킹은 무작위이다. 그렇다면? 제일 많은 랭킹권에 든 아이디가 1등일것이고 이것은 할아버지일 것이다. 하지만, 중복으로 나오는 사람도 있을 것이다. 2등으로 그렇다면 2등은 두명 이상이라면? 각 선수의 번호를 공백으로 구분해 오름차순으로 출력한다는 것이다.

N,M의 범위는 500주 그리고 500명 이하이기때문에 매 주마다 랭킹에 든 아이디를 +1 포인트를 넣어주고 결과적으로 2등을 구하면 되는 문제이다. 이는 정렬을 통해서 문제를 해결하면 되는데, 오랜만에 우선순위 큐를 이용해서 문제를 해결했다. 우선순위 큐는 <자료형, vector<자료형>, 정렬방식> 으로 문제를 구할 수 있다.

#include<iostream>
#include<cstring>
#include<queue>
#include<algorithm>

#define MAX 10010
using namespace std;

int n,m,score[MAX];

struct cmp{
	
	bool operator()(const pair<int,int> a, const pair<int,int> b){
		if(a.second == b.second){
			return a.first > b.first;
		}
		return a.second < b.second;
	}
	
};

int main() {
	
	while(1) {
		
		cin >> n >> m;
		
		if(!n && !m) break;
		
		int highNumber = 0;
		memset(score, 0, sizeof(score));
		priority_queue<pair<int,int>, vector<pair<int,int> > , cmp> pq;
		
		for(int i = 0; i < n; i++){
			for(int j = 0; j < m; j++){
				int number; cin >> number;
				score[number]++;
				if(highNumber < number) highNumber = number;
			}
		}
		
		for(int i = 0; i <= highNumber; i++){
			if(!score[i]) continue;
			pq.push({i, score[i]});
		}
		
		pq.pop();
		
		pair<int,int> tmp = pq.top();
		
		int answer = tmp.second;
		while(!pq.empty()) {
			
			pair<int,int> tmp = pq.top();
			pq.pop();
			if(tmp.second == answer){
				cout << tmp.first << " ";
			} else{
				break;
			}
			
		}
		
		cout << "\n";
		
	}
	
	return 0;
}

'PS > BaekJoon' 카테고리의 다른 글

[C++/23796] 2,147,483,648 게임  (0) 2024.06.19
[C++/25565] 딸기와 토마토  (0) 2024.06.19
[C++/1790] 수 이어 쓰기 2  (0) 2024.06.16
[C++/31937] 로그프레소 마에스트로  (1) 2024.06.13
[C++/1347] 미로 만들기  (1) 2024.06.10