728x90
문제 설명
https://school.programmers.co.kr/learn/courses/30/lessons/172927
문제 풀이 방법
해당 문제는 정렬을 이용해 풀이를 진행했다.
중요 코드를 살펴보면각 곡괭이의 광물당 피로도를 저장하는 obj, 갖고있는 곡괭이로 캘 수 있는 광물만큼 보관하는 newMinerals, 광물이 담겨있는 배열에 특정 광물의 갯수를 반환해주는 check 함수이다.
이 문제에서는 sort 메서드와 reduce 메서드를 중요하게 사용했다.
sort 메서드의 경우는 광물이 담긴 배열에서 다이아몬드와 철의 갯수에 따라 측정 값을 기준으로 정렬했다.
reduce 메서드를 사용할 때 cur 매개변수에 광물의 이름이 나오게 되는데,위에 선언한 idx 변수를 이용해 곡괭이에 따른 각 광물의 피로도를 가져오고 reduce 메서드의 cur를 이용해 피로도를 더하게 된다.
idx의 경우는 순서대로 다이아, 철, 돌 곡괭이가 있냐 없냐에 따라 picks에서 각 곡괭이의 개수를 가져오기 위한 인덱스를 지정한다.
코드
const solution = (picks, minerals) => {
let answer = 0;
let newMinerals = [];
const obj = [
{ "diamond": 1, "iron": 1, "stone": 1 },
{ "diamond": 5, "iron": 1, "stone": 1 },
{ "diamond": 25, "iron": 5, "stone": 1 },
];
const check = (array, word) => {
return array.filter((e) => e === word).length;
}
minerals = minerals.slice(0, picks.reduce((acc, cur) => acc + cur, 0) * 5);
for (let i = 0; i < minerals.length; i += 5) {
newMinerals.push(minerals.slice(i, i + 5));
}
newMinerals.sort((a, b) => {
const aDia = check(a, "diamond");
const bDia = check(b, "diamond");
if (aDia === bDia) {
const aIron = check(a, "iron");
const bIron = check(b, "iron");
return bIron - aIron;
}
return bDia - aDia;
})
let idx = picks[0] ? 0 : (picks[1] ? 1 : 2);
newMinerals.forEach(e => {
answer += e.reduce((acc, cur) => acc + obj[idx][cur], 0);
picks[idx]--
if (picks[idx] === 0) idx++;
})
return answer;
}
728x90
'코딩 테스트 > 프로그래머스 코딩 테스트 연습' 카테고리의 다른 글
[JS] 2Level / 해시 / 전화번호 목록 (0) | 2024.04.18 |
---|---|
[JS] 2Level / 연습문제 / 연속 부분 수열 합의 개수 (1) | 2024.04.09 |
[JS] 2Level / 연습문제 / 디펜스 게임 (0) | 2023.12.28 |
[JS] 2Level / 연습문제 / 리코쳇 로봇 (0) | 2023.12.25 |
2Level / Summer/Winter Coding(2019) / 멀쩡한 사각형 (0) | 2023.12.04 |