문제 소개
🥇️ 문제 레벨 : 골드5
🔔 문제 유형 : 우선 순위 큐, 그리디
💬 풀이 언어 : Kotlin
⏱️ 풀이 시간 : 20분
🖇️ 문제 링크 : 백준 문제 링크
📝 문제
서준이는 아빠로부터 N개의 회의를 모두 진행할 수 있는 최소 회의실 개수를 구하라는 미션을 받았다.
각 회의는 시작 시간과 끝나는 시간이 주어지고 한 회의실에서 동시에 두 개 이상의 회의가 진행될 수 없다.
단, 회의는 한번 시작되면 중간에 중단될 수 없으며 한 회의가 끝나는 것과 동시에 다음 회의가 시작될 수 있다.
회의의 시작 시간은 끝나는 시간보다 항상 작다. N이 너무 커서 괴로워 하는 우리 서준이를 도와주자.
🤔 문제 분석
문제에서 주의해서 봐야할 점은 '한 회의실에서 동시에 두 개 이상의 회의가 진행될 수 없다.'라는 내용이다.
또한, 한 회의가 끝나는 시간과 동시에 다음 회의가 진행될 수 있다는 것을 잘 기억하고 풀이하면 된다.
- 회의 시작 시간이 빠른 순서로 정렬한다.
- 우선 순위 큐를 사용해 종료 시간 큰 값을 기준으로 내림차순 정렬한다.
- 이전 회의의 종료 시간과 다음 회의의 시작 시간을 비교해 회의 진행이 가능한지 확인한다.
😎 최종 코드
1번은 Pair
를 사용한 코드이며, 2번은 data class
를 사용한 코드이다.
시간은 크게 차이가 없지만 메모리를 보면 굉장한 차이가 있다는 것을 알 수 있다.K-V
형태를 저장할 때에는 Pair
를 사용하는 습관을 들이면 좋을 것 같다!
1번 코드
메모리 : 83884 KB
시간 : 900 ms
import java.io.BufferedReader
import java.io.InputStreamReader
import java.util.PriorityQueue
import java.util.StringTokenizer
fun main() = with(BufferedReader(InputStreamReader(System.`in`))) {
val N = readLine().toInt()
val list = mutableListOf<Pair<Int, Int>>()
repeat(N) {
val st = StringTokenizer(readLine())
val first = st.nextToken().toInt()
val second = st.nextToken().toInt()
list += Pair(first, second)
}
list.sortBy { it.first }
val pq = PriorityQueue<Pair<Int, Int>> { a, b -> a.second - b.second }
pq.offer(list[0])
for (i in 1 until N) {
val prev = pq.peek()
val next = list[i]
if (prev.second <= next.first) {
pq.poll()
}
pq.offer(next)
}
println(pq.size)
pq.clear()
}
2번 코드
메모리 : 133684 KB
시간 : 948 ms
import java.io.BufferedReader
import java.io.InputStreamReader
import java.util.PriorityQueue
import java.util.StringTokenizer
fun main() = with(BufferedReader(InputStreamReader(System.`in`))) {
val N = readLine().toInt()
val list = mutableListOf<Room>()
repeat(N) {
val st = StringTokenizer(readLine())
val first = st.nextToken().toInt()
val second = st.nextToken().toInt()
list += Room(first, second)
}
list.sortBy { it.start }
val pq = PriorityQueue<Room> { a, b -> a.end - b.end }
pq.offer(list[0])
for (i in 1 until N) {
val prev = pq.peek()
val next = list[i]
if (prev.end <= next.start) {
pq.poll()
}
pq.offer(next)
}
println(pq.size)
pq.clear()
}
data class Room(val start:Int, val end:Int)
'PS > 정렬' 카테고리의 다른 글
[백준][Java] 2750번 & 10989번 : 수 정렬하기1, 3 (0) | 2022.03.01 |
---|