한개의 회의실을 사용하고자 하는 N개의 회의가 있다. 회의할수있는 최대 팀의 개수를 구해라.
일단, 시간대를 모두 나열하면, 빨리시작하고 빨리 종료하는 것 위주로 선택되어야한다.
그중에서도 회의시간은 종료시간이 빠른순으로 나열하면 영향을 주지않으므로 종료시간에 초점을 맞추며, 종료시간이 같을때는 시작시간이 빠른순으로 나열한다.
그렇게 현재 회의실에 들어가는 팀을 저장하는 변수를 만들고, 그 변수의 끝나는 시간이 다음 시작하는 시간과 같거나 작아야 다음팀이 들어갈수있다. 그렇게 최대회의수를 카운트할수있다.
그리고 시간대 범위가 0이상 2의31승-1이하이므로, long범위로 변수를 저장해야한다.
import java.io.*;
import java.util.*;
public class Main {
static int N;
public static void main(String[] args) throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(System.out));
N = Integer.parseInt(br.readLine());
long[][] meeting = new long[N][2]; // [2] : 길이
for (int i = 0; i < N; i++) {
StringTokenizer st = new StringTokenizer(br.readLine());
meeting[i][0] = Long.parseLong(st.nextToken());
meeting[i][1] = Long.parseLong(st.nextToken());
}
Arrays.sort(meeting, new Comparator<long[]>() {
@Override
public int compare(long[] o1, long[] o2) {
if (o1[1] == o2[1]) {
return (int) (o1[0] - o2[0]);
}
return (int) (o1[1] - o2[1]);
}
});
int count = 1;
long[] meet = meeting[0];
for (int i = 1; i < N; i++) {
if (meet[1] <= meeting[i][0]) {
meet = meeting[i];
count++;
}
}
bw.write(String.valueOf(count));
bw.flush();
br.close();
bw.close();
}
}
종료시간으로 나열하여 회의 running time 해결.
또한, long 범위로 설정. 정렬할때 변수값을 o1[0] - o1[0]으로 해줘서 처음에 오류났었음.
변수주의.