728x90
문제
접근 방식
DP를 이용해서 O(N^2) 풀이를 생각할 수도 있지만 주어진 입력과 제한 시간으로는
해당 시간 복잡도로는 풀 수 없는 문제다.
간단하게 생각해 보면 가장 많은 회의를 배정하기 위해서는
가장 빨리 끝나는 회의들만 골라주면 된다.
1 4
3 5
0 6
5 7
3 8
5 9
6 10
8 11
8 12
2 13
12 14
위의 경우를 예로 들면 첫 번째 회의가 가장 빠른 4시에 끝나니
이 회의를 고른 후에 다음으로 4시 이후에 시작하는 다른 회의를 골라야
가장 효율적으로 회의를 배정할 수 있는 것을 알 수 있다.
1, 4
3, 5
0, 6
5, 7
3, 8
5, 9
6, 10
8, 11
8, 12
2, 13
12, 14
위는 주어진 회의 시간들을 끝나는 시간이 가장 빠른 순으로 정렬하고
끝나는 시간이 같은 경우에는 시작하는 시간이 빠른 순으로 정렬해 준 결과다.
정렬한 뒤에 보면 {1, 4}, {5, 7}, {8, 11}, {12, 14}를 선택하는 것이
가장 효율적이라는 것을 더 알기 쉽게 볼 수 있다.
즉, 정렬을 수행한 후에 시작 시간이 현재까지 기록된
가장 빠른 끝나는 시간보다 크거나 같은 경우가
다음에 올 수 있는 가장 최적의 회의 배정이므로
반복문을 한 번만 수행하여 회의실을 배정할 수 있다.
풀이
public class Main {
public static void main(String[] args) throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
StringTokenizer st;
int n = Integer.parseInt(br.readLine());
int[][] times = new int[n][2];
for (int i = 0; i < n; i++) {
st = new StringTokenizer(br.readLine());
times[i][0] = Integer.parseInt(st.nextToken());
times[i][1] = Integer.parseInt(st.nextToken());
}
Arrays.sort(times, (o1, o2) -> o1[1] != o2[1] ? o1[1] - o2[1] : o1[0] - o2[0]);
int min = -1;
int count = 0;
for (int i = 0; i < n; i++) {
if (min <= times[i][0]) {
count++;
min = times[i][1];
}
}
System.out.println(count);
}
}
'Java > Algorithms' 카테고리의 다른 글
[백준] 11501번 : 주식 (1) | 2024.01.10 |
---|---|
[백준] 2217번 : 로프 (1) | 2023.12.26 |
[백준] 10844번 : 쉬운 계단 수 (0) | 2023.12.24 |
[백준] 15486번 : 퇴사 2 (1) | 2023.12.24 |
[백준] 14501번 : 퇴사 (1) | 2023.12.24 |