https://www.acmicpc.net/problem/1931
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.Arrays;
import java.util.StringTokenizer;
public class Main {
public static void main(String[] args) throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
int N = Integer.parseInt(br.readLine());
int[][] time = new int[N][2];
StringTokenizer st;
for(int i = 0; i < N; i++) {
st = new StringTokenizer(br.readLine(), " ");
time[i][0] = Integer.parseInt(st.nextToken()); // 시작 시간
time[i][1] = Integer.parseInt(st.nextToken()); // 종료 시간
}
// 이 정렬을 해야한다는 것을 떠올려야 했다.
Arrays.sort(time, (o1, o2) -> {
if(o1[1] == o2[1]) {
return o1[0] - o2[0];
} else {
return o1[1] - o2[1];
}
});
int count = 0;
int prevEndTm = 0;
for(int i = 0; i < N; i++) {
if(prevEndTm <= time[i][0]) {
prevEndTm = time[i][1];
count++;
}
}
System.out.println(count);
}
}
처음에는 이전 회의실 끝나는 시간이랑 다음 회의실 시작하는 시간만 비교하면 될 것이라고 생각했는데 아님.
일단 회의실 배정 시간을 끝나는 시간이 큰 순으로 정렬을 한다.
종료시간이 같다면 시작시간을 오름차순으로 정렬한다.
종료시간이 빠르면 빠를 수록 회의실 사용 가능 횟수가 증가한다.
왜 시작시간을 오름차순으로 정렬하냐면,
종료시점으로만 기준으로 정렬하게 되면 경우에 따라서 시작시간이 더 큰 회의실이 먼저 나와서 prevEndTm이 갱신되어 count가 감소하기 때문이다.