https://www.acmicpc.net/problem/11000
<문제>
수강신청의 마스터 김종혜 선생님에게 새로운 과제가 주어졌다.
김종혜 선생님한테는 Si에 시작해서 Ti에 끝나는 N개의 수업이 주어지는데, 최소의 강의실을 사용해서 모든 수업을 가능하게 해야 한다.
참고로, 수업이 끝난 직후에 다음 수업을 시작할 수 있다. (즉, Ti ≤ Sj 일 경우 i 수업과 j 수업은 같이 들을 수 있다.)
수강신청 대충한 게 찔리면, 선생님을 도와드리자!
<풀이>
1. 이차원배열에 시작시간과 끝나는 시간을 저장한 뒤 정렬하여 문제를 풀어보았지만 시간초과로 실패했다.
2. 우선순위 큐를 이용하여 해결하였다.
- 시작시간 순으로 Class 배열을 정렬한다.
- 우선순위 큐에 끝나는 시간을 넣는다.
- 이전 수업의 종료 시간 중 가장 빠른 시간과(우선순위 큐에 넣었으므로 q.peek()을 하게 되면 종료 시간 중 가장 빠른 시간을 골라낸다) 다음 수업의 시작시간이 같거나 늦는다면 같은 강의실을 사용할 수 있으므로 이전 수업을 큐에서 제거한다.
- 다음 수업의 끝나는 시간을 우선순위 큐에 넣는다.
- 과정을 반복하게되면 같은 강의실을 사용할 수 없는 수업의 종료시간만 큐에 남게 되므로
- 큐의 size를 구하면 답이 된다.
package A0225;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.Arrays;
import java.util.PriorityQueue;
import java.util.StringTokenizer;
public class BOJ11000_강의실배정 {
public static void main(String[] args) throws Exception {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
int N = Integer.parseInt(br.readLine());
StringTokenizer st;
PriorityQueue<Integer> q = new PriorityQueue<>();
int[][] Class = new int[N][2];
for(int i=0;i<N;i++) {
st = new StringTokenizer(br.readLine());
Class[i][0]=Integer.parseInt(st.nextToken());
Class[i][1]=Integer.parseInt(st.nextToken());
}
Arrays.sort(Class, (o1, o2) -> {
if(o1[0] == o2[0]){
return Integer.compare(o1[1],o2[1]); }
else{ return Integer.compare(o1[0],o2[0]);
}
});
q.add(Class[0][1]);
for (int i = 1; i < N; i++) {
if (Class[i][0] >= q.peek())
q.poll();
q.add(Class[i][1]);
}
System.out.println(q.size());
}
}
<느낀점>
우선순위 큐를 왜 써야하는지 이해가 잘 되지 않았는데 드디어 이해를 완료했다.
시간초과가 나지 않게 다양한 해결책들을 생각할 수 있는 힘을 더욱 길러야겠다.
'알고리즘' 카테고리의 다른 글
[BOJ] BOJ 15486. 퇴사2 (JAVA) (0) | 2022.03.07 |
---|---|
[BOJ] BOJ 14891. 톱니바퀴 (JAVA) (0) | 2022.03.04 |
[BOJ] BOJ 1969. DNA (JAVA) (0) | 2022.03.03 |
[BOJ] BOJ 1946.신입사원 (JAVA) (0) | 2022.03.03 |
[SWEA] 7465. 창용 마을 무리의 개수 (JAVA) (0) | 2022.03.03 |