문법/알고리즘
그리디/2차배열 정렬/회의실 배정
코딩 화이팅
2023. 4. 27. 22:36
https://www.acmicpc.net/problem/1931
1931번: 회의실 배정
(1,4), (5,7), (8,11), (12,14) 를 이용할 수 있다.
www.acmicpc.net
package 플레가자스터디_백트래킹_BFS_DP;
import java.util.Arrays;
import java.util.Comparator;
import java.util.Scanner;
public class bj_회의실배정_1_1931 {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
int N = sc.nextInt();
int[][] arr = new int[N][2];
for (int i = 0; i < N; i++) {
for (int j = 0; j < 2; j++) {
arr[i][j] = sc.nextInt();
}
}
//회의 시간이 끝나는 시간대로 오름차순 배열을 한다.
Arrays.sort(arr, new Comparator<int[]>() {
@Override
public int compare(int[] o1, int[] o2) {
if (o1[1] == o2[1]) {
return o1[0] - o2[0];
} else {
return o1[1] - o2[1];
}
}
});
int count = 1; // 첫 번째 회의는 무조건 배정되므로 1부터 시작합니다.
int end = arr[0][1]; // 첫 번째 회의의 끝나는 시간을 저장합니다.
for (int i = 1; i < N; i++) {
if (arr[i][0] >= end) { // 다음 회의의 시작 시간이 현재 회의의 끝나는 시간보다 크거나 같으면
count++; // 해당 회의를 배정합니다.
end = arr[i][1]; // 현재 회의의 끝나는 시간을 갱신합니다.
}
}
System.out.println(count); // 가능한 최대 회의 개수를 출력합니다.
}
}
처음 한 실수 : 시작 시간대로 배열을 정렬했었고, 그렇기에 시작 시간별로 각자의 카운트값을 찾아줘 최대값을 구했다. 이러다 보니 완전 탐색을 하게돼 시간 초과
해결법 : 정렬을 회의의 끝 시간대로 정렬을 하게 되면, 순서대로 회의를 마치는 시간대로 정렬이 되어 있으니 반복문을 한 번만 돌리며 회의 가능한 시간대 별로 카운트를 해주면 그게 알아서 최대값이 된다.