import java.util.Arrays;
import java.util.Comparator;
import java.util.PriorityQueue;
public class Main {
public static void main(String[] args) {
int N = 6;
int[][] reading = {{1, 3}, {2, 5}, {7, 8}, {4, 12}, {9, 10}, {7, 11}};
int[] answer = solution(N, reading);
System.out.println(answer[0] + " " + answer[1]);
}
public static int[] solution(int N, int[][] reading) {
int[] answer = new int[2];
// ํ๋ฃจ์ ์ต๋ ๋ช ๋ช
์ด ์ฑ
์ ์ฝ์ ์ ์๋์ง ๊ตฌํจ
Arrays.sort(reading, new Comparator<int[]>() {
@Override
public int compare(int[] start, int[] end) {
if(start[1] == end[1]){
return Integer.compare(start[0], end[0]);
}
return Integer.compare(start[1], end[1]);
}
});
int cnt = 0;
int end = -1;
for (int i = 0; i < N; i++) {
if (reading[i][0] >= end) {
end = reading[i][1];
cnt++;
}
}
answer[0] = cnt;
// ๋ชจ๋ ์ฌ๋๋ค์ด ์ฑ
์ ์ฝ๊ธฐ ์ํด ๋น๋ ค์ผ ํ๋ ์ต์ ๋์ถ ๊ถ์
Arrays.sort(reading, new Comparator<int[]>() {
@Override
public int compare(int[] start, int[] end) {
if(start[0] == end[0]){
return Integer.compare(start[1], end[1]);
}
return Integer.compare(start[0], end[0]);
}
});
PriorityQueue<Integer> pq = new PriorityQueue<>();
for (int i = 0; i < N; i++) {
if (!pq.isEmpty() && pq.peek() <= reading[i][0]){
pq.poll();
}
pq.add(reading[i][1]);
}
answer[1] = pq.size();
return answer;
}
}
1. ๋ฌธ์ ํ์
- ํ๋ฃจ์ ์ฑ
์ ์ฝ์ ์ ์๋ ํ์์ ์์ ๋ชจ๋ ํ์์ด ์ฑ
์ ์ฝ๊ธฐ ์ํด์ ํ์ํ ์ฑ
์ ์๋ฅผ ๊ตฌํ๊ธฐ ์ํด์ ์ฑ
์ ์ฝ๊ธฐ ์์ํ๋ ์์ ๊ณผ ์ข
๋ฃํ๋ ์์ ์ ๋ฐ๋ฅธ ์ ๋ ฌ์ด ํ์ํฉ๋๋ค.
- ํ๋์ ์ด์ด ์ ๋ ฌ๋ ๋ ๋ค๋ฅธ ์ด๋ ํจ๊ป ๋ณ๋๋ผ์ผ ํ๊ธฐ ๋๋ฌธ์ Comparator๋ฅผ ํ์ฉํฉ๋๋ค.
- ํ ๋ช
์ ํ์์ด ์ฑ
์ ๋ค ์ฝ์ผ๋ฉด ๋ค๋ฅธ ํ์์ด ์ฑ
์ ์ฝ์ ์ ์๋๋ก ์ฐ์ ์์ ํ๋ฅผ ํ์ฉํฉ๋๋ค.
2. ํ์ด
- ์ฑ
์ ํ ๊ถ๋ง ์ฃผ์ด์ง๊ธฐ ๋๋ฌธ์ ํ ๋ช
์ ํ์์ด ์ฑ
์ ๋ค ์ฝ์์ ๋ ๋ค๋ฅธ ํ์์ด ์ฑ
์ ์ฝ์ ์ ์์ผ๋ฏ๋ก ์ข
๋ฃ์๊ฐ์ด ๋น ๋ฅผ์๋ก ๋ค๋ฅธ ํ์์ด ์ฑ
์ ์ฝ์ ์ ์๋ ๊ธฐํ๊ฐ ๋ ๋ง์ด ์ฃผ์ด์ง๋๋ค. ๋ฐ๋ผ์, ์ข
๋ฃ ์๊ฐ์ ๊ธฐ์ค์ผ๋ก ์ ๋ ฌํฉ๋๋ค.
Arrays.sort(reading, new Comparator<int[]>() {
@Override
public int compare(int[] start, int[] end) {
if (start[1] == end[1]){
return Integer.compare(start[0], end[0]);
}
return Integer.compare(start[1], end[1]);
}
});
- ํ ๋ช
์ด ์ฑ
์ ๋ค ์ฝ์ผ๋ฉด ๊ณง๋ฐ๋ก ๋ค๋ฅธ ์ฌ๋ํํ
์ฑ
์ ๋๊ธธ ์ ์๊ณ , ๋ค์ ์ข
๋ฃ ์๊ฐ์ ๊ฐฑ์ ํด์ผ ํฉ๋๋ค. ์ต๋ ํ์ ์๋ฅผ ๊ตฌํด์ผ ํ๊ธฐ ๋๋ฌธ์ ์ฑ
์ ๋๊ธธ ๋๋ง๋ค ํ์ ์๋ฅผ ์นด์ดํธํฉ๋๋ค.
int cnt = 0;
int end = -1;
for (int i = 0; i < N; i++) {
if (reading[i][0] >= end) {
end = reading[i][1];
cnt++;
}
}
- ๋ค๋ฅธ ์ฑ
์ ๋น๋ ค์๋ผ๋ ๋ชจ๋ ํ์๋ค์ด ์ฑ
์ ์ฝ์ ์ ์๋๋ก ํ๊ธฐ ์ํด์๋ ์ฑ
์ ์ฝ๊ธฐ ์์ํ๋ ์๊ฐ์ ๊ธฐ์ค์ผ๋ก ์ ๋ ฌํด์ผ ํฉ๋๋ค. ํ ๋ช
์ด 3์์ ์ฑ
์ ๋ค ์ฝ์ ์ ์๋๋ฐ ๋ค๋ฅธ ํ์์ด 2์๋ถํฐ ์ฑ
์ฝ๊ธฐ๊ฐ ๊ฐ๋ฅํ๋ค๋ฉด ์ฑ
์ ํ ๊ถ ๋ ๋์ถํ๋ฉด ๋ฉ๋๋ค.
Arrays.sort(reading, new Comparator<int[]>() {
@Override
public int compare(int[] start, int[] end) {
if(start[0] == end[0]){
return Integer.compare(start[1], end[1]);
}
return Integer.compare(start[0], end[0]);
}
});
- ์ฑ
์ ์ฝ๊ธฐ ์์ํ๋ ์์ ์ ํ์๋ง๋ค ๋ค๋ฅด๊ณ , ์ด๋ค ํ์์ด ๋ด๊ฐ ์ฑ
์ ์ฝ๊ธฐ ์์ํ๋ ์๊ฐ๋ณด๋ค ๋ ๋นจ๋ฆฌ ์ฑ
์ ์ฝ๊ฒ ๋๋ฉด ๊ทธ ์ฑ
์ ์ด์ด์ ์ฝ์ ์ ์๊ธฐ ๋๋ฌธ์ ์ด๋ฅผ ์ํด์ ์ฐ์ ์์ ํ๋ฅผ ์ฌ์ฉํฉ๋๋ค.
for (int i = 0; i < N; i++) {
if (!pq.isEmpty() && pq.peek() <= reading[i][0]){
pq.poll();
}
pq.add(reading[i][1]);
}
- ์ฐ์ ์์ ํ์ ์ญํ ์ด ํ์๋ค์๊ฒ ์ฑ
์ ๋ฐฐ์ ํ๋ ๊ฒ์ด๋ฏ๋ก ์ฐ์ ์์ ํ์ ํฌ๊ธฐ๊ฐ ์ฑ
์ ์ต์ ๋์ถ ๊ถ์๊ฐ ๋ฉ๋๋ค.
answer[1] = pq.size();