해당 게시물은 Kihoon님의 blog를 참고하여 문제풀이를 진행하고 이해를 돕기 위한 커멘트를 추가하였음을 미리 밝힙니다.
마인은 곡괭이로 광산에서 광석을 캐려고 합니다. 마인은 다이아몬드 곡괭이, 철 곡괭이, 돌 곡괭이를 각각 0개에서 5개까지 가지고 있으며, 곡괭이로 광물을 캘 때는 피로도가 소모됩니다. 각 곡괭이로 광물을 캘 때의 피로도는 아래 표와 같습니다.
예를 들어, 철 곡괭이는 다이아몬드를 캘 때 피로도 5가 소모되며, 철과 돌을 캘때는 피로도가 1씩 소모됩니다. 각 곡괭이는 종류에 상관없이 광물 5개를 캔 후에는 더 이상 사용할 수 없습니다.
마인은 다음과 같은 규칙을 지키면서 최소한의 피로도로 광물을 캐려고 합니다.
즉, 곡괭이를 하나 선택해서 광물 5개를 연속으로 캐고, 다음 곡괭이를 선택해서 광물 5개를 연속으로 캐는 과정을 반복하며, 더 사용할 곡괭이가 없거나 광산에 있는 모든 광물을 캘 때까지 과정을 반복하면 됩니다.
마인이 갖고 있는 곡괭이의 개수를 나타내는 정수 배열 picks
와 광물들의 순서를 나타내는 문자열 배열 minerals
가 매개변수로 주어질 때, 마인이 작업을 끝내기까지 필요한 최소한의 피로도를 return 하는 solution 함수를 완성해주세요.
picks
는 [dia, iron, stone]과 같은 구조로 이루어져 있습니다.minerals
의 길이 ≤ 50minerals
는 다음 3개의 문자열로 이루어져 있으며 각각의 의미는 다음과 같습니다.picks | minerals | result |
---|---|---|
[1, 3, 2] | ["diamond", "diamond", "diamond", "iron", "iron", "diamond", "iron", "stone"] | 12 |
[0, 1, 1] | ["diamond", "diamond", "diamond", "diamond", "diamond", "iron", "iron", "iron", "iron", "iron", "diamond"] | 50 |
입출력 예 #1
다이아몬드 곡괭이로 앞에 다섯 광물을 캐고 철 곡괭이로 남은 다이아몬드, 철, 돌을 1개씩 캐면 12(1 + 1 + 1 + 1+ 1 + 5 + 1 + 1)의 피로도로 캘 수 있으며 이때가 최소값입니다.
입출력 예 #2
철 곡괭이로 다이아몬드 5개를 캐고 돌 곡괭이고 철 5개를 캐면 50의 피로도로 캘 수 있으며, 이때가 최소값입니다.
function solution(picks, minerals) {
let answer = 0;
// 총 곡괭이 수의 합
const picksSum = picks.reduce((acc, cur) => acc + cur, 0);
// 곡괭이 당 최대 다섯번 즉, 곡괭이 수 * 5 = 캘 수 있는 광물의 양
const slicedMinerals = minerals.slice(0, picksSum * 5);
const countedMinerals = slicedMinerals.reduce((acc, cur, idx) => {
// 5개씩 캔다고 가정했을 때의 인덱스
const index = Math.floor(idx / 5);
if (!acc[index]) acc[index] = [0, 0, 0];
// 각 광물의 수
if (cur === 'diamond') acc[index][0]++;
else if (cur === 'iron') acc[index][1]++;
else if (cur === 'stone') acc[index][2]++;
return acc;
}, []);
// 다이아가 많은 라인에 다이아 곡괭이를 사용하기 위한 정렬
const sortedMinerals = countedMinerals.sort(
(a, b) => b[0] - a[0] || b[1] - a[1],
);
// 광질
for (const [dia, iron, stone] of sortedMinerals) {
if (picks[0]) {
answer += dia + iron + stone;
picks[0]--;
} else if (picks[1]) {
answer += dia * 5 + iron + stone;
picks[1]--;
} else if (picks[2]) {
answer += dia * 25 + iron * 5 + stone;
picks[2]--;
}
}
return answer;
}