baekjoon/Greedy
백준 1931번 : 회의실 배정 자바
Meluu_
2024. 8. 24. 19:36
🧫 문제 분석
✔️ 출처
📖 문제

정렬 문제로
회의가 끝나는 시간을 기준으로 정렬하되 같다면 시작시간을 오름차순으로 정렬해야한다.
주의할 점은 끝나는 시간에 바로 다른 회의가 시작할 수 있다는 것이다.
정렬 후
마지막 회의 시간 보다 다음 회의의 시작시간이 크거나 같으면 이는 가능한 회의이므로
마지막 회의시간을 다음 회의가 끝나는 시간으로 바꾼다.
종료시간이 같다면 시작시간을 오름차순 정렬을 해야하는 이유
예를 들어보면
4
1 2
2 2
4 4
2 4
이것을 끝나는 시간으로만 정렬했을 경우
입력 순서대로
1 2
2 2
4 4
2 4
이대로 들어왔을 것이고
마지막 회의시간은
2 -> 2-> 4로 되고
2 4 일때 마지막 회의시간 = 4 이기에
이 회의는 무시된다. 따라서 잘못된 답을 내놓게 된다.
🔅 문제 풀이
import java.io.*;
import java.util.PriorityQueue;
import java.util.StringTokenizer;
public class Main {
static class Time implements Comparable<Time>{
int start, end;
public Time(int start, int end) {
this.start = start;
this.end = end;
}
@Override
public int compareTo(Time t) {
// 끝 시간이 같다면 시작 시간 오름차순, 아니라면 끝시간 오름차순
return (end == t.end) ? start - t.start : end - t.end;
}
}
public static void main(String[] args) throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(System.out));
PriorityQueue<Time> pq = new PriorityQueue<>();
int n = Integer.parseInt(br.readLine());
int lastTime = 0;
int count = 1;
// 회의 초기화
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());
pq.add(new Time(start, end));
}
lastTime = pq.poll().end;
while (!pq.isEmpty()) {
Time time = pq.poll();
if (lastTime <= time.start) {
lastTime = time.end;
count++;
}
}
bw.write(count +"");
bw.flush();
bw.close();
}
}
❗ 오답노트 / 필요한 지식
- 못풀었던 문제인데 다시 찾아서 잘 풀었다.