Algorithm/프로그래머스

[프로그래머스] Lv 2. 피로도

RIEN😚 2022. 5. 13. 15:11
728x90
반응형
 

코딩테스트 연습 - 피로도

XX게임에는 피로도 시스템(0 이상의 정수로 표현합니다)이 있으며, 일정 피로도를 사용해서 던전을 탐험할 수 있습니다. 이때, 각 던전마다 탐험을 시작하기 위해 필요한 "최소 필요 피로도"와 던

programmers.co.kr

 

문제

일정 피로도를 사용해서 던전을 탐험할 수 있습니다.

이 때, 각 던전마다 탐험을 시작하기 위해 필요한 "최소 필요 피로도"와 던전 탐험을 마쳤을 때 소모되는 "소모 피로도"가 있습니다.

 

이 게임에는 하루에 한 번씩 탐험할 수 있는 던전이 여러 개 있는데, 한 유저가 오늘 이 던전들을 최대한 많이 탐험하려고 합니다.

현재 피로도 k와 각 던전별 "최소 필요 필요도", "소모 피로도"가 담긴 2차원 배열 dungeons가 매개변수로 주어질 때,

유저가 탐험할 수 있는 최대 던전 수를 return 하도록 solution 함수를 완성해주세요.

 

풀이

반복문의 주체가 되는 dungeons 배열이 매우 작습니다.(최대 8개)

때문에 모든 경우의 수를 확인하는 완전탐색으로 풀어도 가능할 듯 합니다.

 

코드

import kotlin.math.*

class Solution {
    var answer = 0
    fun solution(k: Int, dungeons: Array<IntArray>): Int {
        val visited = BooleanArray(dungeons.size)
        solve(k, 0, dungeons, visited)
        return answer
    }
    
    fun solve(
        k: Int, // 남은 피로도
        result: Int, // 현재까지 완료한 던전 개수
        dungeons: Array<IntArray>, // 던전 정보
        visited: BooleanArray // 던전 방문 여부
    ) {
        answer = max(answer , result)
        for (i in 0 until dungeons.size) {
            // 아직 방문하지 않은 던전이면서 피로도 가능
            if (visited[i].not() && k >= dungeons[i][0]) {
                visited[i] = true
                solve(k-dungeons[i][1],result+1,dungeons,visited)
                visited[i] = false
            }
        }
    }
}
반응형