프로그래머스 광물 캐기 java

배인성·2023년 3월 27일
2

프로그래머스

목록 보기
53/55
post-thumbnail

문제링크

문제링크

문제설명

제한사항

입출력 예

풀이

  1. 문제 조건을 읽어보면, 어차피 곡괭이 하나 들었으면 마인크래프트마냥 앞에꺼 다섯개 무조건 캐야한다.
    1-1 마인크래프트랑은 다르게 앞에 놓여진 블록들을 알때, 어떻게 캐야 제일 효율적으로 캘까?를 묻는것.
  2. minerals를 다섯개씩 묶자. 그러면 section들이 나온다.
  3. 한 section을 다이아몬드, 철, 돌로 캤을때의 피로도를 int[3] 배열에다가 각각 저장해서 섹션별로 이 배열을 들고있자. (2차원 배열)
  4. 이제 정렬이 중요한데 (여기서 엄청 애먹음) "돌로 캤을때 가장 많은 비용이 드는" 섹션을 다이아몬드 곡괭이로 파야한다.
  5. 4번이 이해가 안간다면 다시 읽어보자.. 무기는 다이아몬드 -> 철 -> 돌 순으로 써야 최적이고, 캐는건 "돌로 캤을때 가장 많은 비용이 드는" 섹션을 제일 위로 오게 만들면 된다.
  6. 아 그리고 참 예외가 많은 문제다. "들고있는 곡괭이로 어차피 도달하지 못하는 구간"은 곧 정렬할 섹션에 포함시켜선 안된다. 그러기 위해서 내 코드에서는 num 변수를 사용했다.

ㅜㅜ Level 2는 어엿하게 잘 푼다고 생각했는데 시간이 조금 걸렸다...

대신 사고력이 상승한 기분 ㅎㅎ

코드

import java.util.*;
class Solution {
    public int solution(int[] picks, String[] minerals) {
        int answer = 0;
        int num = picks[0] + picks[1] + picks[2];
        int[][] section = new int[minerals.length / 5 + 1][3];
        int i, pick;
        for(i = 0; i < minerals.length && num > 0; i++) {
            switch(minerals[i].charAt(0))
            {
                case 'd':
                    section[i / 5][0] += 1;
                    section[i / 5][1] += 5;
                    section[i / 5][2] += 25;
                    break;
                case 'i':
                    section[i / 5][0] += 1;
                    section[i / 5][1] += 1;
                    section[i / 5][2] += 5;
                    break;
                case 's':
                    section[i / 5][0] += 1;
                    section[i / 5][1] += 1;
                    section[i / 5][2] += 1;
            }
            if(i % 5 == 4) num--;            
        }
        Arrays.sort(section, new Comparator<int[]>() {
            @Override
            public int compare(int[] o1, int[] o2) {
                if(o1[2] < o2[2]) 
                    return 1;
                else 
                    return -1;
            }
        });
        for(i = 0, pick = 0; i < section.length; i++) {
            while(pick < 3 && picks[pick] == 0) pick++;
            if(pick == 3) break;
            picks[pick]--;
            answer += section[i][pick];
        }
        return answer;
    }
}
profile
부지런히 살자!!

0개의 댓글