백준 9576번 : 책 나눠주기
설명: 이 문제를 처음에는 이분매칭으로 풀려고 하다가, 이분매칭보다는 그냥 Greedy하게 풀면 풀리겠다고 생각해서
그리디로 해결하였다.
List에 사람 각각의 (a,b)를 Pair로 저장해준다. 그리고 Sorting한다.
Sorting의 기준은 b의 오른차순으로 정렬했으며, b가 똑같은 경우 a가 작은 것이 앞에 오도록 정렬하였다.
(만약 input이
1 이라면 소팅 된 후의 값은
5 5 (n,m)
2 4 1 2
3 4 1 3
3 3 3 3
1 2 2 4
1 3 3 4
)
정렬 후 List의 처음부터 한명씩 확인한다.
그리고 그 사람의 a와 b사이를 확인하면서 가져갈 수 있는 책이 존재하면 가져가도록 하고
그 index의 visit을 true로 바꿔준다.
핵심은 정렬의 기준을 잡고 정렬 후 이중for문을 돌면서 확인해서 책을 가져가는 것이라고 생각한다.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 | import java.io.BufferedReader import java.io.InputStreamReader fun main(args: Array<String>) { val br = BufferedReader(InputStreamReader(System.`in`)) data class Pair(val s: Int, val e: Int) : Comparable<Pair> { override fun compareTo(other: Pair): Int { if (this.e != other.e) return this.e - other.e return this.s - other.s } } repeat(br.readLine()!!.toInt()) { val (n, m) = br.readLine()!!.split(" ").map { it.toInt() } val list = Array(m) { val (s, e) = br.readLine()!!.split(" ").map { it.toInt() - 1 } Pair(s, e) } list.sort() val visit = BooleanArray(n) var res = 0 for (i in 0 until m) { for (j in list[i].s..list[i].e) { if (!visit[j]) { visit[j] = true res++ break } } } println(res) } } | cs |
'BOJ(백준)' 카테고리의 다른 글
[BOJ] 1952번 달팽이2 (0) | 2018.12.31 |
---|---|
[BOJ] 백준 11066번 파일 합치기 by Kotlin (0) | 2018.11.21 |
[BOJ] 백준 5397번 키로거 by Kotlin (0) | 2018.11.20 |
[BOJ] 백준 8983번 사냥꾼 by Kotlin (0) | 2018.11.20 |
[BOJ] 2170번 선 긋기 by Kotlin (0) | 2018.11.13 |