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

 

20440번: 🎵니가 싫어 싫어 너무 싫어 싫어 오지 마 내게 찝쩍대지마🎵 - 1

첫째 줄에 지동이의 방에 출입한 모기의 마릿수 N(1 ≤ N ≤ 1,000,000)가 주어진다. 다음 N개의 줄에 모기의 입장 시각 TE과 퇴장 시각 TX이 주어진다. (0 ≤ TE < TX ≤ 2,100,000,000) 모기는 [TE, Tx)동

www.acmicpc.net

 

▶문제

🎵네가 싫어 싫어 너무 싫어 싫어 오지 마 내게 찝쩍대지 마🎵 - 유자, 모기 송 中

모기를 싫어하는 지동이는 어느 날 문득 자신의 방에 모기가 가장 많이 있는 시간대가 언제인지 궁금해졌다. 다행히 지동이 방은 최첨단 시스템이 갖춰져 있어 어떤 모기가 방에 언제 입장했고 언제 퇴장했는지를 기록할 수 있다.

지동이를 도와 모기들의 방 입장, 퇴장 시각이 주어졌을 때 모기들이 가장 많이 있는 시간대와 해당 시간대에 모기가 몇 마리가 있는지 구하는 프로그램을 만들어보자.


▶입력

첫째 줄에 지동이의 방에 출입한 모기의 마릿수 N(1 ≤ N ≤ 1,000,000)가 주어진다.

다음 N개의 줄에 모기의 입장 시각 TE과 퇴장 시각 TX이 주어진다. (0 ≤ TE < TX ≤ 2,100,000,000)

모기는 [TE, Tx)동안 존재한다


▶출력

첫째 줄에 지동이 방에 모기가 가장 많이 있는 시간대의 모기 마릿수를 출력한다.

지동이 방에 모기가 가장 많이 있는 시간대의 연속 구간 전체를 [TEm, TXm)이라고 할 때,

둘째 줄에 TEm, TXm을 공백으로 구분하여 출력한다. 단, 여러 가지 방법이 있으면 가장 빠른 시작 시각을 기준으로 출력한다.


▶해설

이전에 풀었던 강의실 배정과 매우 비슷한 문제여서 설명은 생략하겠습니다.

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.*;
class Time implements Comparable<Time> {
long start;
long end;
public Time(long start, long end) {
this.start = start;
this.end = end;
}
@Override
public int compareTo(Time o) {
if (this.end < o.end) {
return -1;
} else if (this.end == o.end) {
if (this.start < o.start) {
return 1;
} else {
return -1;
}
} else {
return 1;
}
}
}
public class Main {
static int n;
static long[][] arr;
static long a, b;
static PriorityQueue<Time> queue = new PriorityQueue<>();
public static void main(String[] args) throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
n = Integer.parseInt(br.readLine());
arr = new long[n][2];
for (int i = 0; i < n; i++) {
String[] s = br.readLine().split(" ");
arr[i][0] = Long.parseLong(s[0]);
arr[i][1] = Long.parseLong(s[1]);
}
Arrays.sort(arr, (a, b) -> {
if (a[0] <= b[0]) {
return -1;
} else {
return 1;
}
});
int max = 0;
for (int i = 0; i < n; i++) {
while (!queue.isEmpty() && arr[i][0] > queue.peek().end) {
queue.poll();
}
if(!queue.isEmpty() && arr[i][0] == queue.peek().end){
if(queue.peek().end==b){
b = arr[i][1];
}
queue.poll();
}
queue.add(new Time(arr[i][0], arr[i][1]));
if(queue.size()>max){
max = queue.size();
a = arr[i][0];
b = queue.peek().end;
}
}
System.out.println(max);
System.out.println(a + " " + b);
}
}