# BOJ01931 회의실 배정
https://www.acmicpc.net/problem/1931 (opens new window)
한 개의 회의실이 있고 이를 사용하고자 하는 N개의 회의에 대하여 회의실 사용표를 만드려고 한다. 각 회의에 대해 시작시간과 끝나는 시간이 주어져 있고, 각 회의가 겹치지 않게 하면서 회의실을 사용할 수 있는 회의의 최대 개수를 찾아야 한다.
회의는 한번 시작하면 중간에 중단될 수 없다. 한 회의가 끝나면 동시에 다음 회의가 시작될 수 있다.
회의의 시작시간과 끝나는 시간이 같을 수도 있다. 이 경우에는 시작하자마자 끝나는 것으로 생각하면 된다.
# 정렬
끝나는 시간을 기준으로 우선 오름차순 정렬해야 한다. 최대한 많은 시간을 회의에 참여해야 하려면 끝나는 시간이 중요하기 때문이다. 최대한 작은 수의 시간 부터 회의를 진행해야 한다.
그 다음 시작 시간을 고려하여 정렬한다.
Arrays.sort(conferences, (o1, o2) -> {
if (o1[1] < o2[1]) {
return -1;
} else if (o1[1] == o2[1] && o1[0] < o2[0]) {
return -1;
} else if (o1[1] == o2[1] && o1[0] == o2[0]) {
return 0;
}
return 1;
});
# 제출 코드
아래는 위에서 작성한 정렬을 기반으로 최종 제출 코드이다.
import java.util.Arrays;
import java.util.Scanner;
public class BOJ1931 {
public static void main(String[] args) {
Scanner scanner = new Scanner(System.in);
int n = scanner.nextInt(); // 회의의 수
int[][] conferences = new int[n][2];
for (int i = 0; i < n; i++) {
conferences[i][0] = scanner.nextInt();
conferences[i][1] = scanner.nextInt();
}
Arrays.sort(conferences, (o1, o2) -> {
if (o1[1] < o2[1]) {
return -1;
} else if (o1[1] == o2[1] && o1[0] < o2[0]) {
return -1;
} else if (o1[1] == o2[1] && o1[0] == o2[0]) {
return 0;
}
return 1;
});
int count = 1;
int tempEndTime = conferences[0][1];
for (int i = 1; i < n; i++) {
if (tempEndTime <= conferences[i][0]) {
count++;
tempEndTime = conferences[i][1];
}
}
System.out.println(count);
}
}