Bin's Blog

[프로그래머스] Level2 - 광물 캐기(Javascript) 본문

Algorithm

[프로그래머스] Level2 - 광물 캐기(Javascript)

hotIce 2023. 8. 30. 18:51
728x90
 

프로그래머스

코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.

programmers.co.kr

 

📝문제 요약

1️⃣ 마인은 곡괭이로 광산에서 광석을 캐려고 한다. 마인은 다이아몬드 곡괭이, 철 곡괭이, 돌 곡괭이를 0 ~ 5개까지 가지고 있으며, 곡괭이로 광물을 캘 때는 피로도는 소모된다. 

2️⃣ 각 곡괭이는 종류에 상관 없이 광물 5개를 캔 후에는 더 이상 사용할 수 없다. 

3️⃣ 곡괭이를 하나 선택해서 광물 5개를 연속으로 캐고, 다음 곡괭이를 선택해서 광물 5개를 연속으로 캐는 과정을 반복하며, 더 사용할 곡괭이가 없거나 광산에 있는 모든 광물을 캘 때까지 과정을 반복한다. 

4️⃣ 최소한의 피로도를 return 해라.

 

 

✅ 정답 코드

function solution(picks, minerals) {
    let answer = 0;
    // 미네랄의 개수를 5로 나눈 값을 올림
    let len = Math.ceil(minerals.length / 5);
    // 곡괭이의 모든 개수를 더한다.
    let maxLen = picks.reduce((a, b) => a + b);
    
    let arr = [];
    
    // 만약 곡괭이가 없으면 아무것도 캘 수 없으므로 0을 출력
    if (maxLen === 0) return 0;
    
    // 모든 곡괭이가 소진될 때까지(조건 만족)
    minerals = minerals.slice(0, maxLen * 5)


    // 미네랄의 개수를 5개로 나눈 값의 개수만큼 반복문 돌기
    for (let a = 0; a < len; a++) {
        // 광물 개수 파악
        let obj = { d: 0, i: 0, s: 0};
        // mineral을 0번째 부터 5번째까지 자른후 배열을 순회하면서 
        // 자른 배열의 해당 요소를 obj에 카운터
        // v[0] == 문자열의 첫 번째 원소
        minerals.splice(0, 5).map((v) => obj[v[0]]++);
        // [다이아몬드 곡괭이, 철 곡괭이, 돌곡괭이] 순으로 점수 담기
        arr.push([
            obj.d + obj.i + obj.s,
            obj.d * 5 + obj.i + obj.s,
            obj.d * 25 + obj.i * 5 + obj.s
        ])
        
    }
    // stone 곡괭이로 캤을 때 가장 큰 값이 앞에 오도록 내림차순 정렬 
    // 배열을 순회 하면서 stone 곡괭이로 캤을 때 가장 큰 값은 다이아가 많다는 뜻(최소값이 될 수 있음)
    arr
      .sort((a, b) => b[2] - a[2])
      .map((v) => {
        // 다이아 곡괭이를 먼저 사용
        if (picks[0] > 0) return picks[0]--, (answer += v[0]);
        // 다이아 곡괭이가 없으면 철 곡괭이를 사용
        if (picks[1] > 0) return picks[1]--, (answer += v[1]);
        // 철 곡괭이가 없으면 돌 곡괭이 사용
        if (picks[2] > 0) return picks[2]--, (answer += v[2]);
    })
    return answer
}

 

📚 중요 포인트

👉 splice 메서드를 활용해서 원소를 삭제하면서 다음 미네랄들을 캐야지 정확한 값이 나온다. 

👉 총 피로도를 담은 배열에서 돌 곡괭이로 캤을 때의 피로도를 기준으로 정렬해야 한다. 그래야 피로도 최솟값을 받을 수 있다. 

 

 

📔느낀점

👉 이렇게 배열 관련된 문제가 출제되면 메서드를 잘 활용해야 한다. 그리고 점수가 나오면 최고 점수를 고려하자. 

728x90