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 |