import java.util.*;
import java.util.stream.Collectors;
public class Solution {
public int solution(int[] picks, String[] minerals) {
int answer = 0;
int diaPick=picks[0];
int steelPick=picks[1];
int stonePick=picks[2];
//만약 광물은 30개인데 곡괭이는 2개인 경우
//청크는 10개까지만, 즉 2개만 나와야 함
//만약 sort한 청크 index가 4,2,1,0 ..이런식이면 안됨 0,1 청크 두개만 비교해야 함
//그러니, 받아온 광물 리스트를 캘수있는 만큼 까지만 잘라서 sort
List<String> mineralList = Arrays.stream(minerals).collect(Collectors.toList());
if(mineralList.size()>(diaPick+steelPick+stonePick)*5){
mineralList = mineralList.subList(0, (diaPick + steelPick + stonePick) * 5);
}
int totalIter = mineralList.size() / 5;
List<Chunk> chunkList=new ArrayList<>();
for (int i = 0; i <= totalIter; i++) {
List<String> target = mineralList.subList(5 * i, Math.min(5 * (i + 1) , mineralList.size()));
Integer chunkValue = getChunkValue(target);
//System.out.println("chunkValue = " + chunkValue);
if(i==totalIter)
chunkList.add(new Chunk(chunkValue,i, mineralList.size()-5*i));
else chunkList.add(new Chunk(chunkValue,i,5));
}
// for (Chunk chunk : chunkList) {
// System.out.println("chunk = " + chunk);
// }
// System.out.println("================================");
Collections.sort(chunkList);
for (Chunk chunk : chunkList) {
//System.out.println("chunk = " + chunk);
int[] stamina;
if(diaPick>0){
//System.out.println("Use DiaPick");
diaPick--;
stamina= new int[]{1, 1, 1};
}else if(steelPick>0){
//System.out.println("Use SteelPick");
steelPick--;
stamina= new int[]{5, 1, 1};
}else if(stonePick>0){
//System.out.println("Use StonePick");
stonePick--;
stamina= new int[]{25, 5, 1};
}else{
//System.out.println("No picks available");
break;
}
for (int i = chunk.chunkIndex*5; i < chunk.chunkIndex*5+chunk.size; i++) {
String mineral = mineralList.get(i);
if(mineral.equals("diamond")){
answer+=stamina[0];
}else if(mineral.equals("iron"))
answer+=stamina[1];
else
answer+=stamina[2];
//System.out.println("now answer : "+answer);
}
}
return answer;
}
public Integer getChunkValue(List<String> minerals){
Integer chunkValue =0;
for (int i = 0; i < minerals.size(); i++) {
if(minerals.get(i).equals("diamond"))
chunkValue+=5;
else if(minerals.get(i).equals("iron"))
chunkValue+=1;
}
return chunkValue;
}
class Chunk implements Comparable{
Integer value;
@Override
public String toString() {
return "Chunk{" +
"value=" + value +
", chunkIndex=" + chunkIndex +
'}';
}
Integer chunkIndex;
Integer size;
public Integer getValue() {
return value;
}
public Integer getChunkIndex() {
return chunkIndex;
}
public Chunk(Integer value, Integer chunkIndex,Integer size) {
this.value = value;
this.chunkIndex = chunkIndex;
this.size=size;
}
//내림차순 정렬
@Override
public int compareTo(Object o) {
Chunk c = (Chunk) o;
return c.value-this.value;
}
}
}
로직을 구현하고 테스트를 돌리니 딱 한 개의 테스트만 실패했다.
천천히 다시 생각해보니, 곡괭이로 캘 수 있는 광물을 chunk단위로 나누어서 해당 청크의 총 value값으로 sort를 하는 로직에서, 만약 청크는 6개인데 캘수있는 청크는 2개인 경우 청크가 첫번째 청크와 두번째 청크가 정렬된 청크 배열의 0,1번 인덱스에 존재하지 않을 수 있다.
즉, 광물이 캘 수 있는 양보다 많은 경우 캘 수 있는 만큼만 자원으로 받아들여야 한다 !
캘 수 있는 만큼만 subList하는 코드를 추가하니 바로 pass했다 ..
'Algorithm > Programmers' 카테고리의 다른 글
[Lv.2] 미로 탈출 (0) | 2023.04.10 |
---|---|
[Lv.2] 혼자서 하는 틱택토 (0) | 2023.04.10 |
[Lv.2] 당구 연습 (0) | 2023.04.09 |
[Lv.2] 리코챗 로봇 (1) | 2023.04.09 |
[Lv.2] 과제 진행하기 (0) | 2023.04.06 |