문제
N×N의 표에 수 N2개 채워져 있다. 채워진 수에는 한 가지 특징이 있는데, 모든 수는 자신의 한 칸 위에 있는 수보다 크다는 것이다. N=5일 때의 예를 보자.
12 | 7 | 9 | 15 | 5 |
13 | 8 | 11 | 19 | 6 |
21 | 10 | 26 | 31 | 16 |
48 | 14 | 28 | 35 | 25 |
52 | 20 | 32 | 41 | 49 |
이러한 표가 주어졌을 때, N번째 큰 수를 찾는 프로그램을 작성하시오. 표에 채워진 수는 모두 다르다.
입력
첫째 줄에 N(1 ≤ N ≤ 1,500)이 주어진다. 다음 N개의 줄에는 각 줄마다 N개의 수가 주어진다. 표에 적힌 수는 -10억보다 크거나 같고, 10억보다 작거나 같은 정수이다.
출력
첫째 줄에 N번째 큰 수를 출력한다.
🌈 풀이 후기
- 우선순위큐를 이용하면 정말 쉽게 풀 수 있습니다.
- 우선순위 큐를 그냥 사용하면 내림차순으로 정렬되기 때문에 생성할때 Collections.reverseOrder()를 넣어주면 오름차순으로 정렬된 상태로 queue에 저장되어 쉽게 사용할 수 있습니다.
- 알고리즘은 O(NLogN) 입니다.
👩🏫 문제 풀이
알고리즘 - 우선순위 큐
- 우선순위 큐를 생성하고 하나씩 넣는다. 이때 우선순위 큐에 Collections.reverseOrder()를 넣어 오름차순으로 우선순위를 설정한다.
- Queue가 빌때까지 poll 하는데 N번째 poll값을 return 해준다.
package com.Boj.seoul8.week4;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.Collections;
import java.util.PriorityQueue;
import java.util.StringTokenizer;
// PriorityQueue O(NLogN)
public class BOJ_G4_2075_N번째큰수 {
static int N;
static PriorityQueue<Integer> q;
private static int sol() {
int cnt = 1;
while (!q.isEmpty()) {
if (cnt == N)
return q.poll();
else
q.poll();
cnt++;
}
return -1;
}
public static void main(String[] args) throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
N = Integer.parseInt(br.readLine());
StringTokenizer st;
q = new PriorityQueue<Integer>(Collections.reverseOrder());
for (int i = 0; i < N; i++) {
st = new StringTokenizer(br.readLine(), " ");
for (int j = 0; j < N; j++)
q.add(Integer.parseInt(st.nextToken()));
}
int result = sol();
System.out.println(result);
}
}
'Algorithm(알고리즘) > BOJ(백준) 문제풀이' 카테고리의 다른 글
[Java] [백준 1477][이분 탐색, Parametric Search] 휴게소 세우기 (1) | 2021.03.01 |
---|---|
[Java] [백준 1300][이분 탐색, Parametric Search] K번째 수 (0) | 2021.03.01 |
[Java] [백준 11659][누적합] 구간합 4 (0) | 2021.02.27 |
[Java] [백준 2003][투 포인터] 수들의합 2 (0) | 2021.02.27 |
[Java] [백준 1062][재귀,분할정복] 쿼드트리 (0) | 2021.02.17 |