본문으로 바로가기

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

 

프로그래머스

코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.

programmers.co.kr

 


문제 

광물 / 곡괭이 배열이 주어졌을 때 

 

곡괭이를 임의로 선택해서 광물을 캘 때 피로도의 최소값을 출력하는 문제

 


풀이

다이어 / 철 / 돌 곡괭이 모두 확인해야하므로 DFS 를 사용해서 풀었다. 

곡괭이는 5개의 광석을 캐면 더 이상 사용하지 못하므로 index 가 5가 될 때 다음 곡괭이를 선택해주었다. 

 

 

 

class Solution {
    static int min = Integer.MAX_VALUE;
    public int solution(int[] picks, String[] minerals) {
        int answer = 0;
        int dia = picks[0];
        int iron = picks[1];
        int stone = picks[2];
      
        if (dia > 0)
            dfs(0, "d", 0, minerals, dia-1, iron, stone);
        if (iron > 0)
            dfs(0, "i", 0, minerals, dia, iron-1, stone);
        if (stone > 0)
            dfs(0, "s", 0, minerals, dia, iron, stone-1);
        
        return min;
    }
    
    public void dfs(int fatigue, String tool, int index, String[] minerals, int dia, int iron, int stone) {
        if ( index >= minerals.length ) {
            min = Math.min(min, fatigue);
            return;
        }
        
        if (minerals[index].equals("diamond")) {
            if ("d".equals(tool)) {
                fatigue += 1;
            } else if ("i".equals(tool)) {
                fatigue += 5;
            } else {
                fatigue += 25;
            }
        } else if (minerals[index].equals("iron")) {
            if ("d".equals(tool)) {
                fatigue += 1;
            } else if ("i".equals(tool)) {
                fatigue += 1;
            } else {
                fatigue += 5;
            }
        } else if (minerals[index].equals("stone")) {
            if ("d".equals(tool)) {
                fatigue += 1;
            } else if ("i".equals(tool)) {
                fatigue += 1;
            } else {
                fatigue += 1;
            }
        }
        
        if ((index + 1) % 5 == 0) {
            if ((dia == 0 && iron == 0 && stone == 0) ) {
                min = Math.min(min, fatigue);
                return;
            }
            
            if (dia > 0) {
                dfs (fatigue, "d", index+1, minerals, dia-1, iron, stone);
            }
            
            if (iron > 0) {
                dfs(fatigue, "i", index+1, minerals, dia, iron-1, stone);
            }
            
            if (stone > 0) {
                dfs(fatigue, "s", index+1, minerals, dia, iron, stone-1);
            }
        } else {
            dfs(fatigue, tool, index+1, minerals, dia, iron, stone);
        }
    }
}