[Java Algorithm] 프로그래머스 Lv.2_ 피로도

2025. 8. 5. 12:11·Algorithm Study

[문제]

XX게임에는 피로도 시스템(0 이상의 정수로 표현합니다)이 있으며, 일정 피로도를 사용해서 던전을 탐험할 수 있습니다. 이때, 각 던전마다 탐험을 시작하기 위해 필요한 "최소 필요 피로도"와 던전 탐험을 마쳤을 때 소모되는 "소모 피로도"가 있습니다. "최소 필요 피로도"는 해당 던전을 탐험하기 위해 가지고 있어야 하는 최소한의 피로도를 나타내며, "소모 피로도"는 던전을 탐험한 후 소모되는 피로도를 나타냅니다. 예를 들어 "최소 필요 피로도"가 80, "소모 피로도"가 20인 던전을 탐험하기 위해서는 유저의 현재 남은 피로도는 80 이상 이어야 하며, 던전을 탐험한 후에는 피로도 20이 소모됩니다.

이 게임에는 하루에 한 번씩 탐험할 수 있는 던전이 여러개 있는데, 한 유저가 오늘 이 던전들을 최대한 많이 탐험하려 합니다. 유저의 현재 피로도 k와 각 던전별 "최소 필요 피로도", "소모 피로도"가 담긴 2차원 배열 dungeons 가 매개변수로 주어질 때, 유저가 탐험할수 있는 최대 던전 수를 return 하도록 solution 함수를 완성해주세요.

제한사항
- k는 1 이상 5,000 이하인 자연수입니다.
- dungeons의 세로(행) 길이(즉, 던전의 개수)는 1 이상 8 이하입니다.
- dungeons의 가로(열) 길이는 2 입니다.
- dungeons의 각 행은 각 던전의 ["최소 필요 피로도", "소모 피로도"] 입니다.
- "최소 필요 피로도"는 항상 "소모 피로도"보다 크거나 같습니다.
- "최소 필요 피로도"와 "소모 피로도"는 1 이상 1,000 이하인 자연수입니다.
- 서로 다른 던전의 ["최소 필요 피로도", "소모 피로도"]가 서로 같을 수 있습니다.

 

[Algorithm]

가장 핵심이 되는 것은 "탐험 순서"

백트래킹으로 문제를 풀면 된다

* 백트래킹 : 모든 가능한 경우의 수를 체계적으로 탐색하는 알고리즘

 

1. 현재 상태에서 방문 가능한 던전 확인

2. 각 던전을 하나씩 선택해서 탐험

3. 탐험 후 남은 던전들로 재귀 호출

4. 탐험 취소하고 다른 던전 시도 (백트래킹)

5. 모든 경우 중 최대값 반환

 

[Code]

class Solution {
    private int maxDungeons = 0;  // 전역 변수로 최대값 추적
    
    public int solution(int k, int[][] dungeons) {
        maxDungeons = 0;  // 초기화
        boolean[] visited = new boolean[dungeons.length];
        
        // 백트래킹 시작
        backtrack(k, dungeons, visited, 0);
        
        return maxDungeons;
    }
    
    /**
     * 백트래킹 메소드
     * @param currentFatigue 현재 남은 피로도
     * @param dungeons 던전 정보 배열
     * @param visited 던전 방문 여부 배열
     * @param exploredCount 현재까지 탐험한 던전 수
     */
    private void backtrack(int currentFatigue, int[][] dungeons, 
                          boolean[] visited, int exploredCount) {
        
        // 현재까지 탐험한 던전 수로 최대값 갱신
        maxDungeons = Math.max(maxDungeons, exploredCount);
        
        // 모든 던전을 순회하며 탐험 가능한 던전 찾기
        for (int i = 0; i < dungeons.length; i++) {
            // 탐험 조건 확인
            if (canExplore(i, currentFatigue, dungeons, visited)) {
                // 던전 탐험 시작
                visited[i] = true;
                int newFatigue = currentFatigue - dungeons[i][1];

                
                // 재귀 호출로 다음 던전 탐색
                backtrack(newFatigue, dungeons, visited, exploredCount + 1);
                
                // 백트래킹: 던전 탐험 취소
                visited[i] = false;

            }
        }
    }
    
    /**
     * 던전 탐험 가능 여부 확인
     */
    private boolean canExplore(int dungeonIndex, int currentFatigue, 
                              int[][] dungeons, boolean[] visited) {
        return !visited[dungeonIndex] && 
               currentFatigue >= dungeons[dungeonIndex][0];
    }
}

 

[+ 다른 사람 풀이]

class Solution {
    public static boolean check[];
    public static int ans = 0;

    public int solution(int k, int[][] dungeons) {
        check = new boolean[dungeons.length];

        dfs(k, dungeons, 0);

        return ans;
    }
    public static void dfs(int tired, int[][] dungeons, int cnt){
        for(int i=0; i<dungeons.length; i++){
            if(!check[i] && dungeons[i][0]<=tired){
                check[i] = true;
                dfs(tired-dungeons[i][1], dungeons, cnt+1);
                check[i] = false;
            }
        }
        ans = Math.max(ans, cnt);
    }
}

 

로직은 거의 같지만 최대값 갱신 위치가 다르고 이 코드가 좀 더 직관적이다

 


 

 

아직 완전탐색 백트래킹 등등의 문제들이 익숙하지 않아서 직접 풀지못하고 찾아보는중 ..

 

저작자표시 변경금지 (새창열림)

'Algorithm Study' 카테고리의 다른 글

[Java Algorithm] 프로그래머스 Lv.2_ 카펫  (4) 2025.08.04
[Java Algorithm] 프로그래머스 Lv.2_ 소수 찾기  (2) 2025.07.31
[Java Algorithm] 프로그래머스 Lv.1 _ 모의고사  (2) 2025.07.31
[Java Algorithm] 프로그래머스 Lv.1 _ 최소직사각형  (2) 2025.07.30
[Java Algorithm] 프로그래머스 Lv.2 _ H-Index  (2) 2025.07.30
'Algorithm Study' 카테고리의 다른 글
  • [Java Algorithm] 프로그래머스 Lv.2_ 카펫
  • [Java Algorithm] 프로그래머스 Lv.2_ 소수 찾기
  • [Java Algorithm] 프로그래머스 Lv.1 _ 모의고사
  • [Java Algorithm] 프로그래머스 Lv.1 _ 최소직사각형
microsaurs
microsaurs
개발 스터디로그입니다. 공부한 내용을 정리해서 올립니다 ㅇ-ㅇ
  • microsaurs
    microsaurs.devlog
    microsaurs
  • 전체
    오늘
    어제
    • 분류 전체보기 (153)
      • Side Project (4)
      • Algorithm Study (50)
      • JAVA (8)
      • Swift (11)
      • Python (21)
      • CS (5)
      • React (3)
      • 리얼클래스 studylog (27)
      • 정보처리기사[실기] (23)
  • 블로그 메뉴

    • 홈
    • 태그
    • 방명록
  • 링크

  • 공지사항

  • 인기 글

  • 태그

    정보처리기사
    파이썬기초
    정보처리기사프로그래밍언어
    나도코딩
    파이썬문법
    자바알고리즘
    SWIFT
    Python
    Algorithm
    ios개발
    ios프로그래밍을위한스위프트기초
    정처기실기
    프로그래머스
    The Office
    리얼학습일기
    ios프로그래밍
    리얼클래스
    Java
    영어독학
    알고리즘
    프로그래밍언어
    정보처리기사실기
    study
    javaStudy
    스위프트기초
    타일러영어
    더오피스
    영어회화
    javaalgorithm
    파이썬
  • 최근 댓글

  • 최근 글

  • hELLO· Designed By정상우.v4.10.0
microsaurs
[Java Algorithm] 프로그래머스 Lv.2_ 피로도
상단으로

티스토리툴바