프로그래머스 - 광물 캐기

KimGwangmin·약 15시간 전

문제 링크

제출 코드(통과)

using System;

public class Solution {
    public int solution(int[] picks, string[] minerals)
    {
        var pickCount = picks[0] + picks[1] + picks[2];
        var mineralCount = (minerals.Length + 4) / 5;
        var count = Math.Min(pickCount, mineralCount);
        var fatigues = new int[count, 3];
        var fatigueTable = new int[3, 3]
        {
            {1, 5, 25},
            {1, 1, 5},
            {1, 1, 1}
        };

        var groupIndex = 0;
        for (var i = 0; i < minerals.Length; i++)
        {
            var mineral = 
                minerals[i] == "diamond" ? 0 :
                minerals[i] == "iron"    ? 1 :
                minerals[i] == "stone"   ? 2 : -1;

            for (var p = 0; p < 3; p++)
            {
                fatigues[groupIndex, p] += fatigueTable[mineral, p];
            }
            
            if ((i + 1) % 5 == 0 && ++groupIndex >= count)
                break;
        }

        var fatigueIndicies = new int[count];
        for (var i = 0; i < count; i++) fatigueIndicies[i] = i;
        var targetCol = 2;
        
        Array.Sort(fatigueIndicies, (a, b) => -fatigues[a, targetCol].CompareTo(fatigues[b, targetCol])); // 내림차순

        var fatigue = 0;
        foreach (var i in fatigueIndicies)
        {
            if (picks[0] > 0)
            {
                picks[0]--;
                fatigue += fatigues[i, 0];
            }
            else if (picks[1] > 0)
            {
                picks[1]--;
                fatigue += fatigues[i, 1];
            }
            else if (picks[2] > 0)
            {
                picks[2]--;
                fatigue += fatigues[i, 2];
            }
        }
        
        return fatigue;
    }
}

처리 가능한 광물 개수를 먼저 계산한다. (곡괭이가 남을 수도, 광물이 남을 수도 있기 때문에)

해당 광물까지 미리 5개씩 묶어 각 곡괭이별로 필요한 피로도를 모두 계산해둔다.

요구 피로도 기준 내림차순(돌곡괭이 기준으로만 보면 된다)으로 정렬했다.(이때 다차원 배열을 직접 정렬할 수 없으니, 행을 가리키는 인덱스 리스트를 따로 두어 접근 인덱스 순서를 정렬하도록 했다.)

이제 앞에서부터 다이아->철->돌 곡괭이 순으로 소모하면서 처리하면, 가장 적은 피로도를 소모하도록 작업을 할 수 있게 된다.

0개의 댓글