본문 바로가기
알고리즘/백준 & swacademy

BOJ 2075 - N번째 큰 수

by sun__ 2019. 8. 6.

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

 

2075번: N번째 큰 수

첫째 줄에 N(1 ≤ N ≤ 1,500)이 주어진다. 다음 N개의 줄에는 각 줄마다 N개의 수가 주어진다. 표에 적힌 수는 -10억보다 크거나 같고, 10억보다 작거나 같은 정수이다.

www.acmicpc.net

라이님블로그의 풀이를 리뷰.

 

#include <iostream>
#include <queue>
#include <vector>
#include <functional>
using namespace std;

int main() {
	ios_base::sync_with_stdio(false);
	cin.tie(nullptr);
	int n; cin >> n;
	priority_queue<int, vector<int>, greater<int>> pq; //최소힙
	for (int i = 0; i < n; i++) {
		for (int j = 0,a; j < n; j++) { //n개의 원소를 입력받아 힙에 저장
			cin >> a;
			pq.push(a);
		}
		if (i == 0) continue; //첫 n개의 원소를 집어넣은 상태에서 시작.
		for (int j = 0; j < n; j++) pq.pop(); //n개의 원소를 pop
	}
	cout << pq.top() << '\n';
}

 

매 입력마다 n개의 수가 들어오는데, i+1번째 입력으로 들어오는 n개의 수들의 집합 A,  i번쨰 입력으로 들어왔던 n개의 수들의 집합을 B라고 하자. 이 때 A의 수들은 적어도 하나의 B의 수보단 크다.

 

위 성질을 이용해서 n개의 새로운 원소를 최소힙에 넣고 n번 pop하면 top에 있는 원소가 n번째 큰 수가 된다.

 

 

 

어떻게 이런 생각을 하지.. 그냥 LIS처럼 외워야겠다. 금방 까먹을것 같다 ㅜㅜ

 

 

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

BOJ 3745 - 오름세  (0) 2019.08.06
BOJ 16562 - 친구비  (0) 2019.08.06
BOJ 1351 - 무한 수열  (0) 2019.08.06
BOJ 1949 - 우수마을  (0) 2019.08.06
BOJ 1194 - 달이 차오른다, 가자  (0) 2019.08.06