ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • [프로그래머스 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로 계산해서 저장해서 나중에 피로도를 계산해서 집어넣으려고 했음

    댓글

Designed by Tistory.