본문 바로가기
코딩테스트

99클럽 코테 스터디 22일차 TIL : 프로그래머스 피로도, 완전탐색

by fecu 2024. 11. 18.
728x90

 

1. 오늘의 문제

 

오늘 문제는 던전과 관련된 완전탐색 문제였다.

 

어떻게 풀까 고민하던 중, 던전이 8개면 8번의 for문이, 4개면 4개의 for문이 필요하다는 것을 깨달았다.

 

그리고 탐색의 깊이가 최대 8임으로 스택 오버플로우도 피할 수 있을 것 같아서 재귀함수로 풀기로 마음먹었다.

 

더보기

문제 설명


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

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

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

 

2. 코드

 

def solution(k, dungeons):
    answer = []
    # 재귀함수 만들기
    def s(k, dungeons, num):
        # 만약 리스트가 없으면 정답에 횟수 추가 후 반환
        if not dungeons:
            answer.append(num)
            return
        # 던전 최소 피로도, 소모 피로도에서 for문
        for i, (min, cost) in enumerate(dungeons):
            # 만약 최소 피로도보다 적으면 피로도 소모 없이 해당 던전만 제외하고 재귀함수로 들어감
            if k< min:
                kCopy = k
                dungeonsCopy = dungeons.copy()
                dungeonsCopy.pop(i)
                numCopy = num
                s(kCopy, dungeonsCopy, numCopy)
                continue
            # 그렇지 않을 경우는 피로도를 소모하고 횟수를 체크 후 해당 던전 제외 후 재귀함수로 들어감.
            kCopy = k - cost
            numCopy = num + 1
            dungeonsCopy = dungeons.copy()
            dungeonsCopy.pop(i)
            s(kCopy, dungeonsCopy, numCopy)
    s(k, dungeons, 0)
    # 체크한 던전의 횟수 중 가장 큰 것을 선택하고 반환
    answer.sort()
    print(answer)
    result = answer[-1]
    return result

 

3. 느낀점

 

누군가의 도움 없이 재귀함수를 응용하는 복합적인 문제를 해결한 것은 처음이다.

 

시간도 대략 30분 내외로 걸렸다.

 

재귀 함수를 완전히 알게 된 것 같아 기쁘다.

 

문제를 계속해서 풀어보니 예전에는 눈에 보이지 않던 여러 조건들과 문제가 확실하게 보이는 것 같다.

 

앞으로도 꾸준히 문제를 풀어보아야 겠다.

728x90