Loading...
본문 바로가기
👥
총 방문자
📖
0개 이상
총 포스팅
🧑
오늘 방문자 수
📅
0일째
블로그 운영

여러분의 방문을 환영해요! 🎉

다양한 개발 지식을 쉽고 재미있게 알려드리는 블로그가 될게요. 함께 성장해요! 😊

PS/프로그래머스

[프로그래머스][그리디] 광물캐기

by 꽁이꽁설꽁돌 2025. 7. 15.
728x90
반응형
     

목차

     

    문제

    https://school.programmers.co.kr/learn/courses/30/lessons/172927

     

    프로그래머스

    SW개발자를 위한 평가, 교육의 Total Solution을 제공하는 개발자 성장을 위한 베이스캠프

    programmers.co.kr

     

     

    문제 구현 방향

    문제의 까다로운 점은 5개 연속으로 캐야한다는 점이다. 이 조건 때문에 브루트포스로  해보았지만 콜스택 초과가 나기 때문에

    그리디로 접근해야 한다.

     

     

    문제 풀이

    1. 먼저 장비 총 내구도 * 5 만큼만 캘 수 있으니 배열을 잘라준다.

    2. 그 후 5개씩 광물을 잘라서 배열을 만들어 준다.

    3. 다이아 철 돌 순으로 배열을 정렬해 준다.

    4. 배열을 순회하면서 내구도를 감소시키며 피로도를 계산해준다.

     

     

    문제 구현 시 가져갈 점

    1. reduce의 응용 및 배열 5개씩 자르는 방법

     const convertMineral = mineral.reduce((acc, cur, idx)=>{
            const index = Math.floor(idx/5);
            if(!acc[index]) acc[index] = [0,0,0];
            if(cur === 'diamond'){
                acc[index][0]++;
            }else if(cur === 'iron'){
                acc[index][1]++;
            }else{
                acc[index][2]++;
            }
            return acc;
        }, [])

     

    2. 정렬 방법

        convertMineral.sort((a, b)=> b[0] - a[0] || b[1] - a[1]);

     

     

     

    전체 코드

    function solution(picks, minerals) {
        var answer = 0;
        const pickSum = picks.reduce((acc, cur)=>cur+acc, 0);
        const mineral = minerals.slice(0, pickSum*5);
        const convertMineral = mineral.reduce((acc, cur, idx)=>{
            const index = Math.floor(idx/5);
            if(!acc[index]) acc[index] = [0,0,0];
            if(cur === 'diamond'){
                acc[index][0]++;
            }else if(cur === 'iron'){
                acc[index][1]++;
            }else{
                acc[index][2]++;
            }
            return acc;
        }, [])
        convertMineral.sort((a, b)=> b[0] - a[0] || b[1] - a[1]);
        convertMineral.forEach((item)=>{
            let [dia, iro, sto] = item;
            if(picks[0]){
                picks[0]--;
                answer += dia + iro + sto;
                return;
            }
            if(picks[1]){
                picks[1]--;
                answer += dia*5 + iro + sto;
                return;
            }
             picks[2]--;
             answer += dia*25 + iro*5 + sto;
            
        })
        return answer;
    }
    반응형