알고리즘
[알고리즘] 그리디 알고리즘 : 회의실 배정 1931
쿠마냥
2024. 6. 24. 23:49
[문제]
https://www.acmicpc.net/problem/1931
[회고]
- 처음에는 소요 시간이 적은 미팅을 먼저 배정해야 한다고 생각. 그러나 회의가 끝나는 시간을 기준으로 정렬해야 하는 문제였음.
- 알고리즘 분류에 ‘그리디 알고리즘’, ‘정렬’이라고 적힌 것을 힌트 삼아 생각할 것.
- 잘한 점은 'input.txt.'를 만들어서 copy&paste 시간을 줄인 것.
💡 첫째 줄에 회의의 수 N(1 ≤ N ≤ 100,000)이 주어진다.
- 100,000은 for문 안에 for문을 쓸 수 없다. + Order(NlogN)은 쓸 수 있다. = Arrays.sort()를 사용할 것.
💡 [힌트] (1,4), (5,7), (8,11), (12,14) 를 이용할 수 있다.
- 힌트를 잘 읽어 보면 ‘회의가 끝나는 시간’을 기준으로 한 것을 유추할 수 있다.
[코드]
package org.example.basic.ch03;
import java.io.*;
import java.util.Arrays;
import java.util.StringTokenizer;
public class GreedyPractice4 {
public static void main(String[] args) throws IOException {
System.setIn(new FileInputStream("input.txt"));
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
int theNumberOfMeeting = Integer.parseInt(br.readLine());
int[][] arrayOfMeeting = new int[theNumberOfMeeting][2];
for (int i = 0; i < theNumberOfMeeting; i++) {
StringTokenizer st = new StringTokenizer(br.readLine()); // 1 4
arrayOfMeeting[i][0] = Integer.parseInt(st.nextToken());
arrayOfMeeting[i][1] = Integer.parseInt(st.nextToken());
}
Arrays.sort(arrayOfMeeting, (a, b) -> a[1] == b[1] ? a[0] - b[0] : a[1] - b[1]);
int count = 0;
int endTime = 0;
for (int i = 0; i < theNumberOfMeeting; i++) {
if (arrayOfMeeting[i][0] >= endTime) {
endTime = arrayOfMeeting[i][1];
count++;
}
}
System.out.println(count);
}
}