1. 문제
[완전탐색][dfs][재귀]
https://school.programmers.co.kr/learn/courses/30/lessons/87946
프로그래머스
코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.
programmers.co.kr
2. 해설
<bash />
class Solution {
// 최대 탐험 횟수를 저장할 전역 변수
private int max = 0;
// 주어진 던전(dungeons)에서 k만큼의 에너지로 탐험할 때 최대 탐험 횟수를 반환하는 메서드
public int solution(int k, int[][] dungeons) {
// 각 던전을 방문했는지 여부를 저장할 배열
int[] visited = new int[dungeons.length];
// 탐험을 시작하는 메서드 호출
explore(dungeons, visited, k, 0);
// 최대 탐험 횟수 반환
return max;
}
// 재귀적으로 던전을 탐험하며 최대 탐험 횟수를 찾는 메서드
private void explore(int[][] dungeons, int[] visited, int k, int count) {
// 모든 던전을 방문하며 가능한 경우를 체크
for (int i = 0; i < dungeons.length; i++) {
// 방문하지 않았고, 현재 남은 에너지가 해당 던전을 탐험하기에 충분한 경우
if (visited[i] == 0 && k >= dungeons[i][0]) {
// 던전을 방문했다고 표시
visited[i] = 1;
// 던전을 탐험하고, 탐험 횟수와 남은 에너지 갱신
explore(dungeons, visited, k - dungeons[i][1], count + 1);
// 백트래킹: 다른 경로로의 탐험을 위해 방문 표시 해제
visited[i] = 0;
}
}
// 현재 경로에서 얻은 최대 탐험 횟수를 업데이트
if (max < count) {
max = count;
}
}
}
- 주석 참고
- 모든 경우의 수를 확인해야하기 때문에 DFS를 사용하였다.
- 방문한 노드(자기 자신)은 포함되지 않도록 처리 해야함
반응형
'study > 코딩테스트' 카테고리의 다른 글
[프로그래머스][Lv2] 전력망을 둘로 나누기 (0) | 2023.12.27 |
---|---|
[프로그래머스][Lv1][Java] 최소직사각형 (0) | 2023.12.27 |
[프로그래머스][Lv2] 거리두기 확인하기 (0) | 2023.12.21 |
[알고리즘] DFS(깊이우선탐색)와 BFS(너비우선탐색) (1) | 2023.12.20 |
[프로그래머스][Lv0] 모스부호(1) (0) | 2023.06.12 |