코딩테스트/프로그래머스

[프로그래머스]피로도 - Java

GAEBAL 2022. 6. 24. 15:58
728x90

문제

https://programmers.co.kr/learn/courses/30/lessons/87946

 

코딩테스트 연습 - 피로도

XX게임에는 피로도 시스템(0 이상의 정수로 표현합니다)이 있으며, 일정 피로도를 사용해서 던전을 탐험할 수 있습니다. 이때, 각 던전마다 탐험을 시작하기 위해 필요한 "최소 필요 피로도"와 던

programmers.co.kr

 

 

풀이

재귀를 활용한 DFS로 완전 탐색을 해줌!

조건에 맞으면(탐험하지 않은 던전이고, 최소 피로도보다 많은 피로도가 남아 있으면) 다음 단계로 넘겨줌
다음 단계로 넘기기 전에 방문 처리를 해주고 다음 단계를 갔다 오면 다시 방문 처리를 해제해줌!
재귀 함수의 깊이(depth)와 answer를 비교해서 최대값을 answer에 갱신해줌!

 

자세한건 주석으로!

 

 

코드

// 코딩테스트 연습 - 위클리 챌린지 - 피로도
// https://programmers.co.kr/learn/courses/30/lessons/87946

package PROGRAMMERS.level2;

public class Num87946_피로도 {
    private static class Solution{
        static int answer;
        static boolean[] visited;

        private int solution(int k, int[][] dungeons) {
            answer = 0;
            visited = new boolean[dungeons.length];

            dfs(k, dungeons, 0);

            return answer;
        }

        private void dfs(int k, int[][] dungeons, int depth) {
            for (int i = 0; i < dungeons.length; i++) {
                // 탐험하지 않은 던전이고, 최소 피로도보다 많은 피로도가 남아 있으면
                if (!visited[i] && k >= dungeons[i][0]) {
                    visited[i] = true; // 탐험했다고 방문 표시
                    dfs(k - dungeons[i][1], dungeons, depth + 1); // 현재 피로도 감소시킴
                    visited[i] = false; // 탐험 후엔 방문 표시 해제
                }
            }

            answer = Math.max(answer, depth); // 최대값이면 갱신
        }

    }

    public static void main(String[] args) {

        Solution sol = new Solution();

        System.out.println(sol.solution(80, new int[][]{{80, 20}, {50, 40}, {30, 10}}));
    }
}
728x90