[JS] 피로도

GiSeong Lee·2023년 5월 31일
0

피로도

문제 설명

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

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

제한 사항

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

입출력 예

코드

function solution(k, dungeons) {
    let answer = 0;
    let visited = Array(dungeons.length).fill(false);
    
    const dfs = (cnt, currentFatigue) => {
        for(let i=0; i<dungeons.length; i++){
            if(!visited[i] && currentFatigue >= dungeons[i][0]){
                visited[i] = true
                dfs(cnt+1, currentFatigue-dungeons[i][1])
                visited[i] = false
            }
        }
        answer = Math.max(answer, cnt)
    }
    dfs(0,k)
    
    return answer;
}

아직도 dfs, bfs는 적응이 되지 않는다. 알고리즘 문제를 풀 때 제한 사항, 요구사항의 범위가 적다면 완전 탐색을 의심하라고 한다. 대충 문제 보고 전부다 들어갔다 나왔다 해야하구나 생각은 했지만 dfs로 어떻게 적용해야할까 고민을 할 수 밖에 없었다. 검색의 힘을 통해 dfs는 생각보다 간단하구나 라는 생각이 들정도로 간단한 해결방안을 찾았다. 던전의 길이만큼 방문 여부를 기록하는 array를 만들고 재귀를 통해서 던전을 들락날락하면서 들어간 던전만 true로 바꿔주면서 피로도를 계산해주면 됐던것.

profile
프론트가 하고싶어요

0개의 댓글