마이의 개발 블로그
[프로그래머스] 피로도 (Java) 본문
프로그래머스
코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.
programmers.co.kr
접근 방식
모든 던전을 탐색하면서 던전 진입이 가능한지 여부(최소 피로도를 충족하는가)를 체크하고, 그에 따라 발생하는 두 가지 선택지를 고려해야하는 문제이다. 두 가지 선택지는 다음과 같다:
1) 최소 피로도 충족: 던전에 진입해 던전을 탐험 후 소모피로도를 감소시킨 후에 다음 던전을 탐험
2) 최소 피로도 미충족: 현재까지의 탐험 횟수와 최대 탐험 횟수(max)를 비교하여 큰 쪽을 최대 탐험횟수로 변경
이러한 접근 방식을 고려하면 모든 경우의 수를 탐색해야하는데, 던전의 개수가 8개 이하이기 때문에 DFS로 접근하여 문제를 해결했다. 또한 한 번 방문한 던전을 재방문하지 않도록 visited[] 배열을 선언하여 방문여부를 체크했다.
로직 설명
- 방문여부를 체크할 배열 int[] visited 선언
- explore 메서드 내부:
1) 모든 던전에 대해 반복문 실행 (이번 던전을 방문한 적이 없고 던전의 최소 피로도가 k를 넘지 않을때만 실행)
2) 던전의 방문여부 1로 변경, 소모피로도를 k에서 뺀 후 explore() 메서드 다시 실행, 방문여부 0으로 변경
-> 방문여부를 다시 0으로 만드는 이유는 이전 회차의 방문여부가 다음 회차에 영향을 주게 하지 않기 위함
3) 모든 탐험을 마치고 나서 count를 max와 비교하여 더 큰 쪽을 max로 변경
4) max값 반환
class Solution {
public int solution(int k, int[][] dungeons) {
int[] visited = new int[dungeons.length];
explore(dungeons, visited, k, 0);
return max;
}
private int max = 0;
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;
}
}
}
'코딩테스트 > 프로그래머스' 카테고리의 다른 글
[프로그래머스] 달리기 경주 (Java) (0) | 2023.04.11 |
---|---|
[프로그래머스] 게임 맵 최단거리 (Java) (2) | 2023.04.04 |
[프로그래머스] 두 큐 합 같게 만들기 (Java) (0) | 2023.03.20 |
[프로그래머스] 주식가격 (Java) (2) | 2023.03.15 |
[프로그래머스] 뒤에 있는 큰 수 찾기 (Java) (0) | 2023.03.15 |