- 한 개의 회의실이 있는데 이를 사용하고자 하는 N개의 회의에 대하여 회의실 사용표를 만들려고 한다. 각 회의 I에 대해 시작시간과 끝나는 시간이 주어져 있고, 각 회의가 겹치지 않게 하면서 회의실을 사용할 수 있는 회의의 최대 개수를 찾아보자. 단, 회의는 한번 시작하면 중간에 중단될 수 없으며 한 회의가 끝나는 것과 동시에 다음 회의가 시작될 수 있다. 회의의 시작시간과 끝나는 시간이 같을 수도 있다. 이 경우에는 시작하자마자 끝나는 것으로 생각하면 된다.
- 회의 시작 시간과 끝나는 시간을 저장하는 2차배열을 만든다.
- 저장된 배열을 끝나는 시간으로 오름차순을 한다.(단, 끝나는 시간이 같을 경우 시작 시간이 빠른순으로 정렬)
- 반복문을 통해 해당 회의가 시작할 수 있는지 비교를 한다.
import java.io.IOException;
import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.util.Arrays;
import java.util.Comparator;
public class Main {
public static void main(String[] args) throws IOException{
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
int T = Integer.parseInt(br.readLine());
int[][] time = new int[T][2];
for(int i=0; i<T; i++){
String[] str = br.readLine().split(" ");
time[i][0] = Integer.parseInt(str[0]); // 시작시간
time[i][1] = Integer.parseInt(str[1]); // 종료시간
}
Arrays.sort(time, new Comparator<int[]>() { // 끝나는 시간 기준으로 오름차순
@Override
public int compare(int[] o1, int[] o2){
if(o1[1] == o2[1]){ //종료 시간이 같을 때 시작시간이 빠른 순으로 정렬
return o1[0] - o2[0];
}
return o1[1] - o2[1];
}
});
int count=0; // 회의 개수를 위한 변수
int end=0; // 이전 회의 끝난 시간을 저장하는 변수
for(int i=0; i<T; i++){
if(end <= time[i][0]){ // 이전 회의 끝난 시간이 다음 시작시간보다 작거나 같을 때
end = time[i][1];
count++;
}
}
System.out.println(count);
}
}
배열을 sort할 때
Arrays.sort(time, new Comparator<int[]>() { @Override public int compare(int[] o1, int[] o2){}
sort를 하는 방식으로 어떻게 할까 고민이 많이 했었는데 문제를 통해서 위와 같은 방식으로 sort할 수 있는 것을 알게 되었다.