코딩테스트/프로그래머스

[Java] 프로그래머스 level 2 - 광물캐기

곰돌이볼 2023. 3. 29. 09:19

 

  • 로직 1)
    • minerals 광물들을 5개 단위로 캐짐 → 5개 단위로 각 곡괭이로 광물을 캤을 피로도를 배열로 저장
    • 다이아 곡괭이부터 사용해서 광물 캐기 → 이때 캐는 광물은 iron에서 가장 피로도가 높은 광물 캐기
    • 철 곡괭이 사용해서 광물 캐기 → 이때 캐는 광물은 stone에서 가장 피로도가 높은 광물 캐기
    • 돌 곡괭이 사용해서 광물 캐기 → 이때 캐는 광물은 stone에서 가장 피로도가 낮은 광물 캐기
class Solution {
        public int solution(int[] picks, String[] minerals) {
            int answer = 0;

            int len = minerals.length;
            int all_picks = picks[0] + picks[1] + picks[2];
            if(len > all_picks*5) len = all_picks * 5;
            else all_picks = len%5 == 0 ? len/5 : len/5+1;

            int[] diamond = new int[all_picks];
            int[] iron = new int[all_picks];
            int[] stone = new int[all_picks];
            boolean[] visited = new boolean[all_picks];

            int k = -1;
            for(int i=0; i<len; i++) {
                if(i%5 == 0) k++;
                if(minerals[i].equals("diamond")) {
                    diamond[k] += 1;
                    iron[k] += 5;
                    stone[k] += 25;
                } else if(minerals[i].equals("iron")) {
                    diamond[k] += 1;
                    iron[k] += 1;
                    stone[k] += 5;
                } else {
                    diamond[k] += 1;
                    iron[k] += 1;
                    stone[k] += 1;
                }
            }

            k = 0;
            while(true) {
                while(picks[k] != 0) {
                    int index = 0;
                    if(k == 0) {
                        index = max_index(visited, iron);
                        answer += diamond[index];
                    }
                    else if(k == 1) {
                        index = max_index(visited, stone);
                        answer += iron[index];
                    }
                    else if(k == 2) {
                        index = min_index(visited, stone);
                        answer += stone[index];
                    }

                    visited[index] = true;
                    picks[k]--;
                    if(visit(visited)) break;
                }

                if(!visit(visited)) k++;
                else break;
            }

            return answer;
        }

        public int max_index(boolean[] visited, int[] picks_prio) {
            int max = -1;
            int index = 0;

            for(int i=0; i<picks_prio.length; i++) {
                if(!visited[i] && (max < picks_prio[i])) {
                    index = i;
                    max = picks_prio[i];
                }
            }

            return index;
        }
        public int min_index(boolean[] visited, int[] picks_prio) {
            int min = 100;
            int index = 0;

            for(int i=0; i<picks_prio.length; i++) {
                if(!visited[i]) {
                    index = i;
                    if(min > picks_prio[i]) {
                        index = i;
                        min = picks_prio[i];
                    }
                }
            }

            return index;
        }

        public boolean visit(boolean[] visited) {
            for(int i=0; i<visited.length; i++) {
                if(!visited[i]) return false;
            }

            return true;
        }
    }

 

  • 결과
    • 성공