알고리즘

[프로그래머스 2단계] 광물 캐기

고래강이 2024. 3. 8. 08:43

❓문제 설명

  • 광석이랑 곡괭이가 주어질 것임 대충 내용 보면 암
  • 곡괭이는 연속 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로 계산해서 저장해서 나중에 피로도를 계산해서 집어넣으려고 했음