https://school.programmers.co.kr/learn/courses/30/lessons/87946

 

프로그래머스

코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.

programmers.co.kr

 

최소 필요 피로도 = 해당 던전을 탐험하기 위해 가지고 있어야 하는 최소한의 피로도(입장)

소모 피로도 = 던전을 탐험한 후 소모되는 피로도

현재 피로도 k 일 때 탐험할 수 있는 최대 던전 수

예시를 살펴보자.

[[80,20], [50,40], [30,10]] 일 때 탐험 순서에 따라 결과가 달라진다는 것을 알 수 있다.

가장 단순한 방법으로는 모든 탐험 순서의 결과를 찾아보는 것이다. 하지만 이는 비효율적인 방법이다.

무작정 모든 탐험 순서를 보기보다는 가능성이 있는 탐험만 보고 가능성이 없다면 빠져나오는 방식을 사용하겠다. 즉 백트랙킹이다.

여기서 가능성을 어떻게 판단할까?

피로도를 기준으로 판단할 수 있다. 현재 피로도가 다음 던전 탐색 최소 필요 피로도보다 클 때만 탐험을 나아가면 된다.

class Solution {
    
    static int answer = -1;
    
    public int solution(int k, int[][] dungeons) {
        dfs(0, k, dungeons, new boolean[dungeons.length]);
        return answer;
    }
    
    private void dfs(int cnt, int k, int[][] dungeons, boolean[] visited) { 
        for (int i = 0; i < dungeons.length; i++) {
            if (!visited[i] && k >= dungeons[i][0]) {
                visited[i] = true;
                dfs(cnt + 1, k - dungeons[i][1], dungeons, visited);
                answer = Math.max(answer, cnt + 1);
                visited[i] = false;
            }
        }
    }
}

'Algorithm > Programmers' 카테고리의 다른 글

Programmers 92342 - 양궁대회  (0) 2024.10.02
Programmers 12952 - N-Queen  (0) 2024.10.01
Programmers 86971 - 전력망을 둘로 나누기  (1) 2024.09.30
Programmers 67259 - 경주로 건설  (0) 2024.09.30
Programmers 12978 - 배달  (0) 2024.09.29

+ Recent posts