https://www.acmicpc.net/problem/1931
한 회의실에 최대한 많은 회의를 배정해야 하는 문제이다.
그리디 알고리즘을 이용하여 해결할 수 있다.
각 회의가 시작하는 시간과 끝나는 시간이 입력으로 들어온다.
그리디 알고리즘의 기준은 빨리 끝나는 회의 순으로 먼저 배정하는 것이다.
빨리 끝난다는 것은 뒤에 남는시간이 많다는 의미이기 때문에 이것을 기준으로 그리디 알고리즘을 적용하면 최적의 해를 구할 수 있다.
import java.util.*;
public class Main
{
public static void main(String[] args)
{
Scanner sc = new Scanner(System.in);
int n = sc.nextInt(); // 회의 수 입력
int[][] time = new int[n][2]; // 회의 시간 저장 배열
// time[][0]은 시작시점
// time[][1]은 종료시점
for (int i=0; i<n; i++)
{
time[i][0] = sc.nextInt();
time[i][1] = sc.nextInt();
}
// ** 종료 시점 빠른순으로 정렬, 같다면 시작시간 빠른순 **
Arrays.sort(time, new Comparator<int[]>() {
public int compare(int[] o1, int[] o2) {
//종료 시간 같다면 시작 시간 빠른순
if (o1[1] == o2[1]) { // [1]값이 같다면
return o1[0] - o2[0]; // [0]기준 오름치순
}
// 종료 시간 빠른 순으로
return o1[1] - o2[1]; // [1]기준 오름차순
// o2[1] - o1[1] 하면 내림차순
}
});
// ----------- 정렬 완료 --------------
int count = 0;
int prev_end_time = 0; // 직전 회의 종료시간
for (int i=0; i<n; i++) {
// 직전 종료시간이 다음 회의 시간 이하이면 갱신
if (prev_end_time <= time[i][0])
{
prev_end_time = time[i][1]; // 직전 종료 시간을 현 회의 끝나는 시간으로 변경
count++;
}
}
System.out.println(count);
/*for (int i=0; i<n; i++)
{
for (int j=0; j<2; j++)
{
System.out.print("time["+i+"]["+j+"] = " + time[i][j] + " ");
}
System.out.println();
}*/
}
}