FrontEnd/프로그래머스

[JS] 광물 캐기

728x90

직관적인 방식으로 해결해본 것 같다.

 

중요한건 피로도가 1,5,25로 증가하기 때문에, 좋은 광물이 하나라도 있으면 그에 맞는 곡괭이를 사용하는 것이 좋다. 한번 곡괭이를 사용하면 5개는 써야하기 때문에 광물 5개를 한 세트로 묶고, 좋은 광물이 많은 것부터 좋은 곡괭이를 사용하여 채굴하면 된다.

 

정렬과 그리디 알고리즘을 활용해서 해결한 것 같다.

 

 

 

1. 가진 곡괭이로 캘수 있을 만큼의 광물을 count하기

2. 광물을 5개씩 분리해서 배열로 만들어주기

3. 다이아 > 철 > 돌 이 많은 순으로 배열 정렬해주기

4. 다이아 곡괭이 부터 소모하면서 광물 캐기

 

 

 

 

const count = (ary,word) => ary.filter(el => el === word).length

function solution(picks, minerals) {
    let ret = 0
    const m = [];
    
    minerals = minerals.slice(0,picks.reduce((a,c) => a+5*c,0))
    const fatigue = [{'diamond' : 1 , 'iron' : 1 , 'stone' : 1},
                     {'diamond' : 5 , 'iron' : 1 , 'stone' : 1},
                     {'diamond' : 25 , 'iron' : 5 , 'stone' : 1}]
    
    for (let i=0 ; i< minerals.length ; i+=5) m.push(minerals.slice(i,i+5))
    m.sort((a,b) => {
        const aDiaCnt = count(a,'diamond')
        const bDiaCnt = count(b,'diamond')
        if (aDiaCnt === bDiaCnt) {
            const aIronCnt = count(a,'iron')
            const bIronCnt = count(b,'iron')
            return bIronCnt - aIronCnt
        }
        return bDiaCnt-aDiaCnt
    })
    
    let i = picks[0] ? 0 : picks[1] ? 1 : 2
    
    for (const mine of m){
        ret += mine.reduce((a,c) => a+fatigue[i][c],0)
        if (--picks[i]<=0) i++
        if (picks.every(el => !el)) return ret
        
    }
    return ret;
}
728x90

'FrontEnd > 프로그래머스' 카테고리의 다른 글

[JS] 혼자서 하는 틱택토  (0) 2023.05.19
[JS] 리코쳇 로봇  (0) 2023.05.19
[JS] 과제 진행하기  (1) 2023.05.17
[JS] 연속된 부분 수열의 합  (1) 2023.05.16
[JS] 두 원 사이의 정수쌍  (1) 2023.05.16