[Python] 프로그래머스 피로도 문제풀이 및 정답코드

728x90

문제 설명

XX게임에는 피로도 시스템(0 이상의 정수로 표현합니다)이 있으며, 

일정 피로도를 사용해서 던전을 탐험할 수 있습니다. 이때, 각 던전마다 탐험을 시작하기 위해 필요한 "최소 필요 피로도"와 던전 탐험을 마쳤을 때 소모되는 "소모 피로도"가 있습니다. "최소 필요 피로도"는 해당 던전을 탐험하기 위해 가지고 있어야 하는 최소한의 피로도를 나타내며, "소모 피로도"는 던전을 탐험한 후 소모되는 피로도를 나타냅니다. 예를 들어 "최소 필요 피로도"가 80, "소모 피로도"가 20인 던전을 탐험하기 위해서는 유저의 현재 남은 피로도는 80 이상 이어야 하며, 던전을 탐험한 후에는 피로도 20이 소모됩니다.

이 게임에는 하루에 한 번씩 탐험할 수 있는 던전이 여러개 있는데, 한 유저가 오늘 이 던전들을 최대한 많이 탐험하려 합니다. 유저의 현재 피로도 k와 각 던전별 "최소 필요 피로도", "소모 피로도"가 담긴 2차원 배열 dungeons 가 매개변수로 주어질 때, 유저가 탐험할수 있는 최대 던전 수를 return 하도록 solution 함수를 완성해주세요.

제한사항

k는 1 이상 5,000 이하인 자연수입니다.
dungeons의 세로(행) 길이(즉, 던전의 개수)는 1 이상 8 이하입니다.
dungeons의 가로(열) 길이는 2 입니다.
dungeons의 각 행은 각 던전의 ["최소 필요 피로도", "소모 피로도"] 입니다.
"최소 필요 피로도"는 항상 "소모 피로도"보다 크거나 같습니다.
"최소 필요 피로도"와 "소모 피로도"는 1 이상 1,000 이하인 자연수입니다.
서로 다른 던전의 ["최소 필요 피로도", "소모 피로도"]가 서로 같을 수 있습니다.

 

입출력 예

k dungeons result
80 [[80,20],[50,40],[30,10]] 3

 

 

문제풀이

이번 문제도 완전탐색인데,

간단하게 itertools의 permutations을 사용하기에 적합한 문제였다.

 

일단 본 문제에서 중요한 점은, 던전을 도는 순서이다.

던전을 도는 순서에 따라서 모든 던전을 순회할 수 있고, 반면 그렇지 못할 수도 있다.

 

처음에는 그저 정렬해서 쉽게 해결하거나, 백트래킹으로 경우의 수를 뻗어 나가면 되겠다고 생각했다.

하지만 그것보다 문제는 더욱 단순했다.

 

정렬한다고 한들, 모든 경우의 수를 파악할 수 없기 때문에,

주어진 던전에서 발생할 수 있는 모든 서순의 경우의 수가 필요하다.

 

이를 쉽게 구해주는 것이 itertools 라이브러리의 permutations 함수이다.

위 함수의 인자로 리스트를 주고 for문에 넣고 순회해주면,

가능한 모든 경우의 수를 탐색할 수 있도록 제공된다.

 

이번 문제를 계기로 위와 같은 순서가 중요한 완전탐색 문제가 나오면,

itertools의 permutations 함수를 적용하는 것을 고려하도록 할 것이다.

정답코드

from itertools import permutations

def solution(k, dungeons):
    ans = -1
    for dungeon in permutations(dungeons):
        cnt, tmp = 0, k
        for limit, cost in dungeon:
            if tmp >= limit:
                tmp -= cost
                cnt += 1
        ans = max(cnt, ans)
    return ans
728x90