[백준][Kotlin] - 최소 회의실 개수(19598)

문제 소개

🥇️ 문제 레벨 : 골드5

🔔 문제 유형 : 우선 순위 큐, 그리디

💬 풀이 언어 : Kotlin

⏱️ 풀이 시간 : 20분

🖇️ 문제 링크 : 백준 문제 링크


📝 문제

서준이는 아빠로부터 N개의 회의를 모두 진행할 수 있는 최소 회의실 개수를 구하라는 미션을 받았다. 각 회의는 시작 시간과 끝나는 시간이 주어지고 한 회의실에서 동시에 두 개 이상의 회의가 진행될 수 없다.

단, 회의는 한번 시작되면 중간에 중단될 수 없으며 한 회의가 끝나는 것과 동시에 다음 회의가 시작될 수 있다. 회의의 시작 시간은 끝나는 시간보다 항상 작다. N이 너무 커서 괴로워 하는 우리 서준이를 도와주자.

🤔 문제 분석

문제에서 주의해서 봐야할 점은 ‘한 회의실에서 동시에 두 개 이상의 회의가 진행될 수 없다.’라는 내용이다. 또한, 한 회의가 끝나는 시간과 동시에 다음 회의가 진행될 수 있다는 것을 잘 기억하고 풀이하면 된다.

  1. 회의 시작 시간이 빠른 순서로 정렬한다.
  2. 우선 순위 큐를 사용해 종료 시간 큰 값을 기준으로 내림차순 정렬한다.
  3. 이전 회의의 종료 시간과 다음 회의의 시작 시간을 비교해 회의 진행이 가능한지 확인한다.

😎 최종 코드

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)

댓글남기기