문제
문제 설명
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맞냐고오....
✅ 정답 풀이
최소 피로도, 소모 피로도와 관련이 없는 것을 알았다. 그렇다면 답은 완전 탐색 !
완전 탐색을 하는 방법에는 크게 세가지(?)가 있는 것 같다.
1. 순열, 2. DFS
DFS중에서도 백트레킹과 함께 사용하는 방법을 이용했다.
🤔 백트레킹 유무
백트레킹이 없는 DFS
- 한 번 DFS로 한 경로를 끝까지 탐색하면, 그 경로는 그대로 종료된다.
- 상태 복원이 없다 : 한번 방문한 노드나 상태가 그대로 남아서, 다른 경로 탐색시 복원이 이루어지지 않는다.
그래서 만약 이 문제를 풀때 백트레킹이 없는 경우,
한 던전을 방문하면, 그 던전은 계속 방문한 상태로 남아 있어서 다른 경로에서 고려되지 않는 사태가 발생한다.
백트레킹이 있는 DFS
- DFS로 한 경로를 탐색하다가 더 이상 진행할 수 없으면, 되돌아가서(백트래킹) 이전 상태로 복원한다.
- 상태를 복원한다. 재귀 호출 후에 방문 처리한 노드를 다시 원상 복귀해서 완전 탐색을 잘 수행하도록 한다.
던전을 탐험할 때, 한 던전을 방문 후 피로도를 소모한 상태에서 다시 돌아와서, 다른 던전 탐험 순서를 시도할 수 있게 복원하는 것이다.

만약 현재 형광펜대로 방문을 했다고 하면 1,2,3 모두 방문 처리가 된 상태로 다시 3으로 가게 될 텐대,
이럴 경우 3에서 2가 방문 처리가 됐다고 생각되어 탐색을 하지 않게 된다.
그렇기 때문에 모든 던전을 탐색하기 위해서 백트레킹이 필수적이다.
코드
function solution(k, dungeons) {
let maxCount = 0;
function dfs(curr, count, visited){
maxCount = Math.max(count,maxCount);
for(let i=0;i<dungeons.length;i++){
if(!visited[i]&&curr >= dungeons[i][0]){
visited[i] = true;
// 재귀 호출후, 다시 원상복구 => 백트레킹
dfs(curr-dungeons[i][1],count+1,visited);
visited[i] = false;
}
}
}
dfs(k,0,new Array(dungeons.length).fill(false));
return maxCount;
}
NOTE
반복하기...😭
https://school.programmers.co.kr/learn/courses/30/lessons/87946
프로그래머스
SW개발자를 위한 평가, 교육, 채용까지 Total Solution을 제공하는 개발자 성장을 위한 베이스캠프
programmers.co.kr
'CodingTest' 카테고리의 다른 글
| [PROGRAMERS / JavaScript] 더 맵게 (0) | 2025.02.19 |
|---|---|
| [PROGRAMERS / JavaScript] 베스트앨범 (1) | 2025.02.12 |
| SQL 정리 (0) | 2025.02.11 |
| [PROGRAMERS / JavaScript] 주식가격 (0) | 2025.02.10 |
| [PROGRAMERS / JavaScript] 가장 큰 수 (0) | 2025.02.10 |