SSAFY-09-D7 / term1-group3

3조 화이팅💚💙🖤💛
3 stars 1 forks source link

PROGRAMMERS 광물 캐기 #371

Open 210-reverof opened 1 year ago

210-reverof commented 1 year ago

https://school.programmers.co.kr/learn/courses/30/lessons/172927

210-reverof commented 1 year ago
import java.util.*;

class Solution {
    int answer = Integer.MAX_VALUE;
    String[] ms;
    int[][] energy = {{1,1,1}, {5,1,1}, {25,5,1}}; 

    public int solution(int[] picks, String[] minerals) {
        ms = minerals;
        search(picks, 0, 0);
        return answer;
    }

    private void search(int[] picks, int mIdx, int energySum) {
        if (mIdx > ms.length || getLeft(picks) == 0) {
            System.out.println(Arrays.toString(picks));
            answer = Math.min(answer, energySum);
            return;
        }

        for (int i = 0; i < 3; i++) {
            if (picks[i] > 0) {
                picks[i]--;

                int[] currResult = mining(i, mIdx);
                search(picks, mIdx + currResult[1], energySum + currResult[0]);

                picks[i]++;
            }
        }  
    }

    private int[] mining(int pick, int mIdx) {
        // 현재부터 5개 에너지
        int energySum = 0;
        int idx = mIdx;
        for (int i = 0; i < 5; i++) {
            if (idx == ms.length) return new int[]{ energySum, idx };
            System.out.print(pick + "," + getNum(ms[idx]) + "=" + energy[pick][getNum(ms[idx])] + "  ");
            energySum += energy[pick][getNum(ms[idx])];
            idx++;
        }
        return new int[]{ energySum, idx };
    }

    private int getLeft(int[] picks) {
        return picks[0] + picks[1] + picks[2];
    }

    private int getNum(String str) {
        if (str.equals("diamond")) return 0;
        if (str.equals("iron")) return 1;
        return 2;
    }
}