백준 19598 최소 회의실 개수 java
TABLE OF CONTENTS
1. 문제에 대하여 📦
회의가 N개 주어진다.
각 회의는 시작 시간, 끝 시간 형태로 이루어져 있다.
회의마다 강의실이 필요하고, 하나의 회의실에서는 하나의 회의밖에 하지 못한다. 하나의 회의가 끝나는 시간에 바로 다른 회의를 시작할 수 있다고 할 때, 모든 회의를 진행하기 위해서 필요한 최소 회의실의 개수는 몇 개인가?
각 회의는 시작 시간, 끝 시간 형태로 이루어져 있다.
회의마다 강의실이 필요하고, 하나의 회의실에서는 하나의 회의밖에 하지 못한다. 하나의 회의가 끝나는 시간에 바로 다른 회의를 시작할 수 있다고 할 때, 모든 회의를 진행하기 위해서 필요한 최소 회의실의 개수는 몇 개인가?
2. 코드가 나오기까지 🛠️
KEY WORD: 그리디 알고리즘- (시작 시간, 끝 시간)을 멤버로 가지는 클래스를 만든다.
해당 클래스에 대하여 끝시간 오름차순 우선순위 큐 만들기 -> 우선순위 큐가 강의실 역할을 하고, 우선순위 큐의 사이즈가 강의실 개수임.
- 입력 받아사 (시작 시간, 끝시간) 객체로 만들고 시작 시간 오름차순 정렬 (시간 순으로 차례대로 보기 위해)
- 정렬한 리스트에서 차례대로 꺼내서 다음을 진행
- 큐가 비어져 있으면 그냥 넣기
- 큐가 안 비어져 있으면 큐의 peek() 강의의 끝시간과 현재 조회 중인 강의의 시작시간 비교
- 만약 peek() 끝 시간이 현재 조회 중인 시작 시간보다 빠르다면 (강의실에 강의가 먼저 끝난다면) 그렇지 않을 때까지 poll()
- peek()의 끝 시간이 현재 조회 중인 시작 시간보다 느리다면( 제일 빠르게 끝나는 강의도 현재 시작하려는 강의보다 늦게 끝남) -> 큐에 넣기 (새로운 강의실 선정)
(1) 시간복잡도 분석 ⏳
강의가 총 N개라 했을 때,
- 강의 시작 시간 순 정렬: $O(N \log{N})$
- 강의 하나씩 순회하며 큐에 넣거나 뺴기:$O(N \times \log{N})$
3. 코드 🌐
import java.util.*; import java.io.*; // 19598번 최소 회의실 개수 public class Main { static class Lecture { int start; int end; public Lecture(int start, int end){ this.start = start; this.end = end; } @Override public String toString(){ return String.format("(%d, %d)", this.start, this.end); } } static int N; static ArrayList<Lecture> list = new ArrayList<>(); static PriorityQueue<Lecture> pq = new PriorityQueue<>(Comparator.comparingInt(a -> a.end)); public static void main(String[] args) throws IOException { BufferedReader br = new BufferedReader(new InputStreamReader(System.in)); N = Integer.parseInt(br.readLine()); int max = 0; for(int i = 0; i < N; i++){ StringTokenizer st = new StringTokenizer(br.readLine()); int start = Integer.parseInt(st.nextToken()); int end = Integer.parseInt(st.nextToken()); list.add(new Lecture(start, end)); } list.sort(Comparator.comparingInt(a -> a.start)); for(int i = 0; i < list.size(); i++){ Lecture now = list.get(i); if(pq.isEmpty()) pq.add(now); else { while(!pq.isEmpty() && now.start >= pq.peek().end) pq.poll(); pq.add(now); } max = Math.max(max, pq.size()); } System.out.printf("%d",max); } }
4. 트러블 슈팅 or 배운 점📝
문제 풀이 적을 때는 List는 시작 순 정렬을 해놓고, 계속 끝시간 정렬한 채 문제를 풀어서 틀렸다. 정신 차리고 문제 풀어야 한다.