[프로그래머스] 광물 캐기 JAVA

AMUD·2023년 11월 27일
0

Algorithm

목록 보기
76/78

문제


문제링크

접근

  • 단위 수가 작아서 백트래킹을 가장 먼저 떠올렸다.
  • 일반적인 백트래킹 형태로 풀이하면 되지만, 한 조건을 사용할 때 5번의 사용이 있다는 것을 잘 구현하면 어려움 없이 구현할 수 있다.

풀이

import java.util.*;

class Solution {
    int[] pick, used, ms;
    int[][] energy;
    int len, pickCnt, answer = Integer.MAX_VALUE;
    public int solution(int[] picks, String[] minerals) {
        energy = new int[][]{{1, 1, 1}, {5, 1, 1}, {25, 5, 1}};
        pick = picks;
        used = new int[3];
        len = minerals.length;
        ms = new int[len];
        
        for (int p : picks) {
            pickCnt += p;
        }
        
        for (int i = 0; i < len; i++) {
            String min = minerals[i];
            ms[i] = min.equals("diamond") ? 0 : min.equals("iron") ? 1 : 2; 
        }
        
        find(0, 0, 0, 0);
        
        return answer;
    }
    
    private void find(int cnt, int p, int usedEnergy, int depth) {
        if (usedEnergy >= answer) return;
        if (depth < len && cnt > 0) {
            find(cnt-1, p, usedEnergy + energy[p][ms[depth]] , depth+1);
            return;
        }
        
        if (depth == len || used[0] + used[1] + used[2] == pickCnt) {
            answer = Math.min(answer, usedEnergy);
            return;
        }
        
        for (int i = 0; i < 3; i++) {
            if (used[i] >= pick[i]) continue;
            used[i]++;
            find(4, i, usedEnergy + energy[i][ms[depth]], depth+1);
            used[i]--;
        }
    }
}
profile
210's Velog :: Ambition Makes Us Diligent

0개의 댓글