광물캐기


title: 2026-01-21 author: 강병호 (이름) date: 2026-01-21 (날짜) category: TIL/강병호/2026/01 (파일 경로 : TIL/{이름}/{연}/{월}) layout: post (자유) —

import java.util.*;

// 최소한의 피로도 -> 광물 캐기
// 광물은 주어진 순서대로
// 종료 조건 : 곡괭이 x or 모든 광물 캐는 경우
// 곡괭이 하나 - 광물 5개
// 최대한 다이아 곡괭이로 다 파기 x
// 1. back traking 
// 10 개 구간 발생 -> 최대 3^10
// 2. 5개 묶기. Greedy 처리

class Solution {
    
    static int answer = Integer.MAX_VALUE;

    public int cal(String mineral, int pick) {
        if (pick == 0) return 1;
        else if (pick == 1) {
            if (mineral.equals("diamond")) return 5;
            return 1;
        } else {
            if (mineral.equals("diamond")) return 25;
            else if (mineral.equals("iron")) return 5;
            return 1;
        }
    }
    
    public int totalCal(String[] minerals, int index, int pick) {
        int sum = 0;
        int maxIndex = (minerals.length > index + 5) ? index + 5: minerals.length;
        for (int i = index; i < maxIndex; i++) {
            sum += cal(minerals[i], pick);
        }
        
        return sum;
    }
    
    public void solve(int diaCount, int ironCount, int stoneCount, String[] minerals, int n, int index, int cnt) {
        // 종료 조건
        if (diaCount == 0 && ironCount == 0 && stoneCount == 0) {
            answer = Math.min(cnt, answer);
            return;
        }
        
        if (n <= index) {
            answer = Math.min(cnt, answer);
            return;
        }
        // 계산, 한 번에 다섯개
        if (diaCount > 0) {
            int num = totalCal(minerals, index, 0);
            solve(diaCount-1, ironCount, stoneCount, minerals, n, index+5, cnt+num);
        }
        
        if (ironCount > 0) {
            int num = totalCal(minerals, index, 1);
            solve(diaCount, ironCount-1, stoneCount, minerals, n, index+5, cnt+num);
        }
        
        if (stoneCount > 0) {
            int num = totalCal(minerals, index, 2);
            solve(diaCount, ironCount, stoneCount-1, minerals, n, index+5, cnt+num);
        }
         
    }
    
    public int solution(int[] picks, String[] minerals) {
        
        // picks 의 sum이 minerals의 길이보다 큰 경우 -> 곡괭이 부족
        // picks 의 sum이 minerals의 길이보다 작은 경우 -> 광물 다 캐는 경우
        int n = minerals.length;
        
        
        solve(picks[0], picks[1], picks[2], minerals, n, 0, 0);    
        
        return answer;
    }
}

results matching ""

    No results matching ""