제출 코드(통과)
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개씩 묶어 각 곡괭이별로 필요한 피로도를 모두 계산해둔다.
요구 피로도 기준 내림차순(돌곡괭이 기준으로만 보면 된다)으로 정렬했다.(이때 다차원 배열을 직접 정렬할 수 없으니, 행을 가리키는 인덱스 리스트를 따로 두어 접근 인덱스 순서를 정렬하도록 했다.)
이제 앞에서부터 다이아->철->돌 곡괭이 순으로 소모하면서 처리하면, 가장 적은 피로도를 소모하도록 작업을 할 수 있게 된다.