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 |