반응형
1. 백트래킹?
이름 그대로 앞에 내용을 확인해본 뒤에 다른 예상한 값과 다를 경우 다시 뒤로 돌아가서 숫자를 갱신하여 옳은 답을 찾아나가는 알고리즘으로, DFS (완전탐색)을 기반으로 한 알고리즘이다.
문제 설명
| XX게임에는 피로도 시스템(0 이상의 정수로 표현합니다)이 있으며, 일정 피로도를 사용해서 던전을 탐험할 수 있습니다. 이때, 각 던전마다 탐험을 시작하기 위해 필요한 "최소 필요 피로도"와 던전 탐험을 마쳤을 때 소모되는 "소모 피로도"가 있습니다. "최소 필요 피로도"는 해당 던전을 탐험하기 위해 가지고 있어야 하는 최소한의 피로도를 나타내며, "소모 피로도"는 던전을 탐험한 후 소모되는 피로도를 나타냅니다. 예를 들어 "최소 필요 피로도"가 80, "소모 피로도"가 20인 던전을 탐험하기 위해서는 유저의 현재 남은 피로도는 80 이상 이어야 하며, 던전을 탐험한 후에는 피로도 20이 소모됩니다. 이 게임에는 하루에 한 번씩 탐험할 수 있는 던전이 여러개 있는데, 한 유저가 오늘 이 던전들을 최대한 많이 탐험하려 합니다. 유저의 현재 피로도 k와 각 던전별 "최소 필요 피로도", "소모 피로도"가 담긴 2차원 배열 dungeons 가 매개변수로 주어질 때, 유저가 탐험할수 있는 최대 던전 수를 return 하도록 solution 함수를 완성해주세요. |
풀이
class Solution {
static int answer;
static boolean[] visited;
public int solution(int k, int[][] dungeons) {
answer = 0;
visited = new boolean[dungeons.length];
back(k, dungeons, 0);
System.out.println(answer);
return answer;
}
public static void back(int k, int[][] dun, int cnt) {
answer = Math.max(answer, cnt);
for (int i = 0; i < dun.length; i++) {
if (k >= dun[i][0] && !visited[i]) {
visited[i] = true;
back(k - dun[i][1], dun, cnt+1);
visited[i] = false;
}
}
}
}
방문 배열 visited를 이용하였다. 던전의 수 만큼 방문 배열을 만들어 준 뒤, 재귀함수를 통해 답을 찾아가도록 하였다.
각 함수에 들어가면서 현재 탐험한 던전의 값과, 이전에 탐험했던 던전의 값들을 모두 탐색하며 최대로 들어갈 수 있는 던전의 수를 갱신해나가는 방식이다.
여기서 중요한 것은 다음 반복문의 탐색을 위해 방문이 끝난 후에 visited 배열을 다시 false로 처리해주어야 다음 탐색이 가능하다. ( 던전이 3개일 경우, 2번쨰, 3번째 부터 들어가는 경우의 수도 있기 때문)
이 문제가 완전 탐색이 가능한 이유는 문제에서 최대 8개의 던전이 있다고 제시하고 있기 때문에 최대로 방문할 수 있는 던전의 갯수는 8! (약 40000개 이상)으로, 완전 탐색을 하여도 충분히 빠른 속도로 계산이 가능하다.
프로그래머스
SW개발자를 위한 평가, 교육, 채용까지 Total Solution을 제공하는 개발자 성장을 위한 베이스캠프
programmers.co.kr
728x90
반응형
'CodingTest' 카테고리의 다른 글
| 투 포인터 (1) - 연속된 부분 수열의 합 (0) | 2025.02.01 |
|---|---|
| 백트래킹 (2) - 이모티콘 할인행사 (0) | 2025.01.31 |
| LIS (최장 증가 부분 수열) (1) | 2025.01.27 |
| 프로그래머스 2레벨 - [PCCP 기출문제] 2번 / 퍼즐 게임 챌린지 (0) | 2024.09.09 |
| Binary Search (이진 탐색) (2) | 2024.09.09 |