❓문제 설명
- 광석이랑 곡괭이가 주어질 것임 대충 내용 보면 암
- 곡괭이는 연속 5번 사용해야하므로 5개씩 끊어서 광석을 나눠야 할 듯
- 광석은 곡괭이별로 캐야하는 피로도가 주어지는데 피로도의 최솟값을 구하는 문제임
✅ 문제 해결
- 최솟값을 구할 것이며 곡괭이 수가 광물을 캘 갯수만큼 안나오면 짤라야 함 ex) 곡괭이는 3개인데 광물은 300개면 어짜피 광물 중에 순서대로 15개밖에 못 캠
- 5개씩 배열로 만들어서 내용물을 이러쿵저러쿵할것임
function solution(picks, minerals) {
var answer = 0;
var cutCount = Math.ceil(minerals.length/5);
let maxLen = picks.reduce((a, b) => a + b);
if (maxLen === 0) return 0;
minerals = minerals.splice(0,maxLen*5);
var arr = [];
for(var i = 0;i<cutCount;i++){
let obj = {diamond:0, iron:0, stone: 0};
minerals.splice(0,5).map((element)=>{
obj[element]++;
})
arr.push([obj.diamond+obj.iron+obj.stone,obj.diamond*5+obj.iron+obj.stone,obj.diamond*25+obj.iron*5+obj.stone])
}
arr = arr.sort((a, b) => b[2] - a[2])
for(var i = 0;i<picks.length;i++){
var pickCount =picks[i];
while(pickCount--){
if(arr.length ===0){
return answer;
}
answer+=arr.shift()[i];
}
}
return answer;
}
🔥 인상 깊은 남의 풀이
function solution(picks, minerals) {
var answer = 0;
var cutCount = Math.ceil(minerals.length/5);
let maxLen = picks.reduce((a, b) => a + b);
if (maxLen === 0) return 0;
minerals = minerals.splice(0,maxLen*5);
var arr = [];
for(var i = 0;i<cutCount;i++){
let obj = {diamond:0, iron:0, stone: 0};
minerals.splice(0,5).map((element)=>{
obj[element]++;
})
arr.push([obj.diamond+obj.iron+obj.stone,obj.diamond*5+obj.iron+obj.stone,obj.diamond*25+obj.iron*5+obj.stone])
}
arr = arr.sort((a, b) => b[2] - a[2])
for(var i = 0;i<picks.length;i++){
var pickCount =picks[i];
while(pickCount--){
if(arr.length ===0){
return answer;
}
answer+=arr.shift()[i];
}
}
return answer;
}
❕느낀점
- 처음에 예외상황에 대해서와 문제를 구해야하는 방식은 어느정도 맞췄는데 간단히 하려고 생각했던 부분에서 오히려 나중에 계산이 힘들어진 것이 있다
- 결국 아쉬운 마음을 뒤로하고 풀이를 보면서 이해를 하는데 집중을 하였고 주어진 값에 대해서 3가지 경우를 각 배열당 저장을 하고 나중에 for문을 돌리면서 그 배열에서 골라서 집어 넣는 방식이 좀 더 좋은 것 같다는 생각이 들었다.
- 이전 풀이가 사라져서 조금 아쉽지만 말로 설명하자면 배열에 다이아는 100 철은 10 돌은 1로 계산해서 저장해서 나중에 피로도를 계산해서 집어넣으려고 했음