- 알고리즘/백준

백준 14501 퇴사 완전탐색(코틀린)

더모어더베러 2023. 10. 17. 17:40

문제

https://www.acmicpc.net/problem/14501

 

14501번: 퇴사

첫째 줄에 백준이가 얻을 수 있는 최대 이익을 출력한다.

www.acmicpc.net

 

풀이

 

상담 소요일을 더하고 재귀호출을 하여 반복문 index값을 다음 상담 날짜로 변경하여 줍니다.

import java.io.*
import kotlin.math.max

var N_14501 = 0
lateinit var T: IntArray // 상담 소요 일수
lateinit var P: IntArray // 수익
var result_14501 = 0
fun main(args: Array<String>) {

    // 브루트포스 (완전탐색)
    var br = BufferedReader(InputStreamReader(System.`in`))
    var bw = BufferedWriter(OutputStreamWriter(System.out))


    N_14501 = br.readLine().toInt() // 일할수 있는 날짜
    T = IntArray(N_14501) // 상담 소요 일수
    P = IntArray(N_14501) // 수익

    for (i in 0 until N_14501) {
        var (t,p) = br.readLine().split(" ").map { it.toInt() }
        T[i] = t
        P[i] = p
    }
    check14501(0,0, 0)

    bw.write(result_14501.toString())
    bw.flush()
    bw.close()

}

fun check14501(idx: Int, cnt: Int, total: Int) {
    var price = total

    // cnt : 다음상담 날짜
    // total : 수익 총액
    if (cnt >= N_14501) {
        result_14501 = max(result_14501, total)
        return
    }

    for (i in idx until N_14501) {
        var a = P[i]

        // i+T[i] : 다음상담 날짜
        if (i+T[i] <= N_14501) price += a   // 마지막날에 상담소요일 하루일 경우까지 수익금을 더해준다.
        check14501(i + T[i], i+T[i], price)
        if (i+T[i] <= N_14501) price -= a
    }
}