광물 캐기
마인은 곡괭이로 광산에서 광석을 캐려고 합니다. 마인은 다이아몬드 곡괭이, 철 곡괭이, 돌 곡괭이를 각각 0개에서 5개까지 가지고 있으며, 곡괭이로 광물을 캘 때는 피로도가 소모됩니다. 각 곡괭이로 광물을 캘 때의 피로도는 아래 표와 같습니다.
예를 들어, 철 곡괭이는 다이아몬드를 캘 때 피로도 5가 소모되며, 철과 돌을 캘때는 피로도가 1씩 소모됩니다. 각 곡괭이는 종류에 상관없이 광물 5개를 캔 후에는 더 이상 사용할 수 없습니다.
마인은 다음과 같은 규칙을 지키면서 최소한의 피로도로 광물을 캐려고 합니다.
- 사용할 수 있는 곡괭이중 아무거나 하나를 선택해 광물을 캡니다.
- 한 번 사용하기 시작한 곡괭이는 사용할 수 없을 때까지 사용합니다.
- 광물은 주어진 순서대로만 캘 수 있습니다.
- 광산에 있는 모든 광물을 캐거나, 더 사용할 곡괭이가 없을 때까지 광물을 캡니다.
즉, 곡괭이를 하나 선택해서 광물 5개를 연속으로 캐고, 다음 곡괭이를 선택해서 광물 5개를 연속으로 캐는 과정을 반복하며, 더 사용할 곡괭이가 없거나 광산에 있는 모든 광물을 캘 때까지 과정을 반복하면 됩니다.
마인이 갖고 있는 곡괭이의 개수를 나타내는 정수 배열 picks
와 광물들의 순서를 나타내는 문자열 배열 minerals
가 매개변수로 주어질 때, 마인이 작업을 끝내기까지 필요한 최소한의 피로도를 return 하는 solution 함수를 완성해주세요.
https://school.programmers.co.kr/learn/courses/30/lessons/172927
import java.util.Arrays;
import java.util.Collections;
import java.util.LinkedList;
import java.util.List;
public class Main29 {
public static void main(String[] args) {
int[] picks = {1, 3, 2};
String[] minerals = {"diamond", "diamond", "diamond", "iron", "iron", "diamond", "iron", "stone"};
var reuslt = solution(picks, minerals);
System.out.println(reuslt);
}
public static int solution(int[] picks, String[] minerals) {
var result = bfs(picks, minerals);
return Collections.min(result);
}
public static List<Integer> bfs(int[] picks, String[] minerals) {
List<Integer> result = new LinkedList<>();
LinkedList<int[]> picksList = new LinkedList<>();
LinkedList<Integer> tiredList = new LinkedList<>();
picksList.add(picks);
tiredList.add(0);
int mineralIndex = 0;
while (mineralIndex != minerals.length && !picksList.isEmpty()) {
int size = picksList.size();
int tempMineralIndex = mineralIndex;
for (int l = 0; l < size; l++) {
var currentPick_ = picksList.poll();
var currentTired_ = tiredList.poll();
// 곡괭이 경우의 수
for (int pickIndex = 0; pickIndex < 3; pickIndex++) {
int[] currentPick = {currentPick_[0], currentPick_[1], currentPick_[2]};
var currentTired = currentTired_;
int miningIndex = tempMineralIndex;
if (currentPick[pickIndex] == 0) {
continue;
}
// 부수기
for (int i = 0; i < 5; i++) {
if (miningIndex == minerals.length) {
break;
}
String mTemp = minerals[miningIndex];
if (pickIndex == 0) {
currentTired++;
} else if (pickIndex == 1) {
if (mTemp.equals("diamond")) {
currentTired += 5;
} else {
currentTired++;
}
} else if (pickIndex == 2) {
if (mTemp.equals("diamond")) {
currentTired += 25;
} else if (mTemp.equals("iron")) {
currentTired += 5;
} else if (mTemp.equals("stone")) {
currentTired++;
}
}
miningIndex++;
}
mineralIndex = miningIndex;
currentPick[pickIndex]--;
if ((currentPick[0] == 0 && currentPick[1] == 0 && currentPick[2] == 0) || miningIndex == minerals.length) {
result.add(currentTired);
} else {
tiredList.add(currentTired);
picksList.add(currentPick);
}
}
}
}
return result;
}
}