[프로그래머스] 피로도

J. Hwang·2024년 11월 18일
0

coding test

목록 보기
48/108

문제 설명

XX게임에는 피로도 시스템(0 이상의 정수로 표현합니다)이 있으며, 일정 피로도를 사용해서 던전을 탐험할 수 있습니다. 이때, 각 던전마다 탐험을 시작하기 위해 필요한 "최소 필요 피로도"와 던전 탐험을 마쳤을 때 소모되는 "소모 피로도"가 있습니다. "최소 필요 피로도"는 해당 던전을 탐험하기 위해 가지고 있어야 하는 최소한의 피로도를 나타내며, "소모 피로도"는 던전을 탐험한 후 소모되는 피로도를 나타냅니다. 예를 들어 "최소 필요 피로도"가 80, "소모 피로도"가 20인 던전을 탐험하기 위해서는 유저의 현재 남은 피로도는 80 이상 이어야 하며, 던전을 탐험한 후에는 피로도 20이 소모됩니다.
이 게임에는 하루에 한 번씩 탐험할 수 있는 던전이 여러개 있는데, 한 유저가 오늘 이 던전들을 최대한 많이 탐험하려 합니다. 유저의 현재 피로도 k와 각 던전별 "최소 필요 피로도", "소모 피로도"가 담긴 2차원 배열 dungeons 가 매개변수로 주어질 때, 유저가 탐험할수 있는 최대 던전 수를 return 하도록 solution 함수를 완성해주세요.


제한사항

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

입출력 예

kdungeonsresult
80[[80,20],[50,40],[30,10]]3

내 풀이

import itertools

def solution(k, dungeons):
    all = list(itertools.permutations(dungeons))
    
    no_of_visits = []
    for a in all:
        b = list(a)
        cnt = 0
        now = k
        for i in range(len(b)):
            if b[i][0] > now:
                pass
            else:   # b[0] <= now
                this = now - b[i][1]
                if this < 0:
                    pass            
                else:   # now > 0
                    cnt += 1
                    now = this
        no_of_visits.append(cnt)
        
    return max(no_of_visits)

코멘트

처음에는 정렬을 잘 하고 조건문을 적용하면 풀 수 있는 문제라 생각했는데 최소 필요 피로도와 소모 피로도를 어떻게 정렬해도 답을 구하는데는 쓸모가 없다는 것을 한참 고민 끝에야 깨달았다...
결국 혼자서 풀이를 생각하지 못해서 다른 풀이를 참고했는데 DFS 등을 이용해서 완전 탐색을 하고 조건을 추가해 방문할 수 있는 던전 개수를 세고 그 중 가장 큰 수를 반환하는 식으로 풀어야 했다.
그 와중에 변수를 어디서 선언/초기화하고 어떤 변수를 써야하는지 헷갈려서 중간에 오답을 받기는 했지만, 수정해서 결국 정답을 얻을 수 있었다.


References

https://school.programmers.co.kr/learn/courses/30/parts/12230
https://velog.io/@snghyun331/프로그래머스-완전탐색L.v2-피로도-파이썬

profile
Let it code

0개의 댓글