728x90
https://www.acmicpc.net/problem/2109
2109번: 순회강연
한 저명한 학자에게 n(0 ≤ n ≤ 10,000)개의 대학에서 강연 요청을 해 왔다. 각 대학에서는 d(1 ≤ d ≤ 10,000)일 안에 와서 강연을 해 주면 p(1 ≤ p ≤ 10,000)만큼의 강연료를 지불하겠다고 알려왔다.
www.acmicpc.net
문제 풀이
1. 입력으로 주어지는 강연 정보를 list 에 저장한다.
2. list 를 강연료를 기준으로 내림 차순 정렬한다.
3. 10001 크기의 lecture int 배열을 선언한다. 강연을 잡을 경우 lecture 배열에 강연료를 업데이트하는 용도로 사용한다.
4. list 를 다음과 같은 기준으로 탐색 한다.
4-1. list 의 d 값을 index 로 하여 lecture[index] 가 0일 경우에는 강연이 없는 날이므로 강연료(list.p) 를 lecture 배열에 업데이트 한다.
4-2. list 의 d 값을 index 로 하여 lecture[index] 가 0이 아닐 경우 강연이 이미 잡혀 있는 날이므로 이전 날짜를 탐색하여 lecture 배열에서 비어있는 부분 혹은 현재 강연료보다 싼 강연료를 탐색한다.
5. lecture 배열을 탐색하여 0이 아닌 값을 result 에 합하여 결과를 출력한다.
코드
import java.io.*
fun main(args: Array<String>) {
val br = BufferedReader(InputStreamReader(System.`in`))
val n = br.readLine().toInt()
val list = mutableListOf<Lecture>()
repeat(n) {
val (p, d) = br.readLine().split(" ").map { it.toInt() }
list.add(Lecture(p, d))
}
// 강연료 기준으로 내림차순 정렬 한다.
list.sortWith { o1, o2 ->
o2.p - o1.p
}
val lecture = IntArray(10001) { 0 }
// list 를 탐색한다.
for (l in list) {
// lecture 배열의 list 의 d를 index 로 했을 때 값이 0이면 강연 스케쥴이 비어 있으므로 강연을 할 수 있다.
if (lecture[l.d] == 0) {
lecture[l.d] = l.p
} else {
// lecture 배열의 list 의 d를 index 로 했을 때 값이 0이 아니면
// 이미 다른 강연 스케쥴이 있으므로 잡혀있는 강연 스케쥴보다 강연료가 비싼지 확인하여
// 비싸면 현재 값으로 업데이트 한다.
// 비싸지 않으면 이전 날짜를 탐색하여 비어있는 날짜 혹은 강연료가 현재 강연료 보다 싼 강연을 탐색한다.
if (lecture[l.d] < l.p) {
lecture[l.d] = l.p
} else {
var day = l.d - 1
while (day > 0) {
if (lecture[day] == 0) {
lecture[day] = l.p
break
} else {
if (lecture[day] < l.p) {
lecture[day] = l.p
break
} else {
day--
}
}
}
}
}
}
var result = 0
for (lec in lecture) {
if (lec != 0) result += lec
}
println(result)
}
private data class Lecture(val p: Int, val d: Int)
728x90
'알고리즘(w.KOTLIN) > 그리디(Greedy)' 카테고리의 다른 글
[백준][코틀린][1541] 잃어버린 괄호 (0) | 2023.05.11 |
---|---|
[백준][코틀린][12015] 가장 긴 증가하는 부분 수열2 (0) | 2023.05.11 |
[백준][코틀린][1202] 보석 도둑 (0) | 2023.05.08 |
[백준][코틀린][1285] 동전 뒤집기 (0) | 2023.05.08 |
[백준][코틀린][2138] 전구와 스위치 (0) | 2023.05.02 |