프로그래머스 광물캐기 java

정상민·2023년 9월 14일

문제링크

문제 접근

  • 5개씩 한묶음으로 각 광물 개수 객체로 리스트 생성
  • 다이아가 1개라도 있으면 다이아<철<돌 순으로 캐는게 최소
  • 철이 1개라도 있으면 다이아==철<돌 순으로 캐는게 최소
  • 즉 광물 개수 객체를 다이아,철 갯수로 내림차순 정렬 후 다이아->철->돌 곡괭이 사용하면 됨

코드

import java.util.*;
class Solution {
    public int solution(int[] picks, String[] minerals) {
        int answer = 0;
        int idx = 0;
        int pickCnt = picks[0] + picks[1] + picks[2];
        ArrayList<MineralCnt> map = new ArrayList<>();    
        while(idx<minerals.length && idx < pickCnt*5){
            if(idx % 5 == 0){
                int endIdx = Math.min(idx + 4, minerals.length-1);
                int diaCnt = 0;
                int ironCnt = 0;
                int stoneCnt = 0;
                for(int i=idx;i<=endIdx;i++){
                    if(minerals[i].equals("diamond")) diaCnt++;
                    else if(minerals[i].equals("iron")) ironCnt++;
                    else if(minerals[i].equals("stone")) stoneCnt++;
                }
                map.add(new MineralCnt(diaCnt,ironCnt,stoneCnt));
            }
            idx++;
        }
        Collections.sort(map);
        int nowPick = -1;
        for(int i=0;i<map.size();i++){
            MineralCnt m = map.get(i);
            if(picks[0] > 0){
                picks[0]--;
                answer += (m.diaCnt + m.ironCnt + m.stoneCnt);
            }
            else if(picks[1] > 0){
                picks[1]--;
                answer += ((m.diaCnt*5) + m.ironCnt + m.stoneCnt);
            }
            else if(picks[2] > 0){
                picks[2]--;
                answer += ((m.diaCnt*25) + (m.ironCnt*5) + m.stoneCnt);
            }
            else break;
        }
        // for(int i=0;i<map.size();i++){
        //     MineralCnt m = map.get(i);
        //     System.out.println("dia : "+m.diaCnt+" iron : "+m.ironCnt+" stone : "+m.stoneCnt);
        // }
        return answer;
    }
    private static class MineralCnt implements Comparable<MineralCnt>{
        int diaCnt;
        int ironCnt;
        int stoneCnt;
        public MineralCnt(int diaCnt, int ironCnt, int stoneCnt){
            this.diaCnt = diaCnt;
            this.ironCnt = ironCnt;
            this.stoneCnt = stoneCnt;
        }
        @Override
        public int compareTo(MineralCnt m) {
            if(this.diaCnt > m.diaCnt) return -1;
            else if(this.diaCnt < m.diaCnt) return 1;
            else{
                if(this.ironCnt > m.diaCnt) return -1;
                else if(this.ironCnt < m.diaCnt) return 1;
                else return 0;
            }
            
        }
    }
}

결과


정리

  • Comparable 정렬하는 방법 아직도 덜 익숙하다
  • 무조건 앞에부터 광물을 캘 수 있으므로 곡괭이가 부족한데 맨 뒤의 광물들까지 함께 정렬하면 안됨
profile
안녕하세요! 개인 공부를 꾸준히 기록하는 공간입니다.

0개의 댓글