[프로그래머스] 피로도

2023. 3. 3. 13:41Algorithm

완전탐색문제에 도전했다!

1.현재 피로도
2.탐험전: 각 던전의 최소 필요 피로도
3.탐험후: 각 던전의 소모 피로도

위 세 값이 주어지고, 이 때 유저가 탐험할 수 있는 최대 던전 수를 return 

던전을 1->2->3 , 2->1->3 처럼 순서없이 돌 수 있다.

 

모든 던전탐방 경우의 수를 해보고, 가장 많은 던전을 돌 수 있는 경우의 수를 뽑으면 됨 !

function solution(k, dungeons) {
    let tired =[] // 방문한 던전 수
    const n = dungeons.length // 던전의 총 개수
    //각 던전 방문여부(방문: 1, 아직: 0)
    let ch = Array.from({ length: n }, () => 0); 

    function dfs(now, game){
        for (let i = 0; i < n; i++) {
     	   // 이 던전에 방문하지 않았고, 방문가능한 피로도이면
            if (ch[i] === 0 && dungeons[i][0]<=now) { 
                ch[i] = 1; //방문 처리
                // 피로도, 방문횟수 수정 후 dfs 재귀
                dfs(now - dungeons[i][1], game+1); 
                ch[i] = 0; // 다음을 위해 미방문처리
            }
        }
        //완주 후 남은 피로도가 0이상이면, 던전 방문 횟수 기록
        now >=0 && tired.push(game) 
    }
     dfs(k, 0)
    return Math.max(...tired); //최대 방문 횟수 return
}

사실 어떻게 지금 코드가 모든 경우의 수를 처리하는지 이해하지 못했다....

앗..!

지금 코드를 다시 보면서 이해했다.... 

for문을 돌면서 처음 방문 위치가 1, 2, 3으로 변경된다.

for문의 i가 1이면 그 안에서 재귀를 통해 1 > 2 > 3 / 1 > 3 > 2을 모두 방문할 수 있다.

1 > 1 > 1이 안되는 이유는 ch리스트로 방문 값을 처리해주었기 때문!

드디어 이해가 되었다..!

 

for문과 재귀가 중첩되면서 이해가 어려울 수 있지만, 여러 블로그의 설명을 통해 다들 이해하길~~! 아자아자~!

'Algorithm' 카테고리의 다른 글

[프로그래머스] N으로 표현  (0) 2023.03.09
JavaScript 템플릿 리터럴(백틱``, 달러${})  (0) 2023.03.09
스택과 큐  (0) 2023.03.02
[프로그래머스] 프린터  (0) 2023.03.02
[프로그래머스] 베스트앨범  (0) 2023.03.02