[Programmers] 문제 제목 - JavaScript
마인은 곡괭이로 광산에서 광석을 캐려고 합니다. 마인은 다이아몬드 곡괭이, 철 곡괭이, 돌 곡괭이를 각각 0개에서 5개까지 가지고 있으며, 곡괭이로 광물을 캘 때는 피로도가 소모됩니다. 각 곡괭이로 광물을 캘 때의 피로도는 아래 표와 같습니다.
예를 들어, 철 곡괭이는 다이아몬드를 캘 때 피로도 5가 소모되며, 철과 돌을 캘때는 피로도가 1씩 소모됩니다. 각 곡괭이는 종류에 상관없이 광물 5개를 캔 후에는 더 이상 사용할 수 없습니다.
마인은 다음과 같은 규칙을 지키면서 최소한의 피로도로 광물을 캐려고 합니다.
즉, 곡괭이를 하나 선택해서 광물 5개를 연속으로 캐고, 다음 곡괭이를 선택해서 광물 5개를 연속으로 캐는 과정을 반복하며, 더 사용할 곡괭이가 없거나 광산에 있는 모든 광물을 캘 때까지 과정을 반복하면 됩니다.
마인이 갖고 있는 곡괭이의 개수를 나타내는 정수 배열 picks
와 광물들의 순서를 나타내는 문자열 배열 minerals
가 매개변수로 주어질 때, 마인이 작업을 끝내기까지 필요한 최소한의 피로도를 return 하는 solution 함수를 완성해주세요.
picks
는 [dia, iron, stone]과 같은 구조로 이루어져 있습니다.
minerals
의 길이 ≤ 50
minerals
는 다음 3개의 문자열로 이루어져 있으며 각각의 의미는 다음과 같습니다.picks | minerals | result |
---|---|---|
[1, 3, 2] | ["diamond", "diamond", "diamond", "iron", "iron", "diamond", "iron", "stone"] | 12 |
[0, 1, 1] | ["diamond", "diamond", "diamond", "diamond", "diamond", "iron", "iron", "iron", "iron", "iron", "diamond"] | 50 |
입출력 예 #1
다이아몬드 곡괭이로 앞에 다섯 광물을 캐고 철 곡괭이로 남은 다이아몬드, 철, 돌을 1개씩 캐면 12(1 + 1 + 1 + 1+ 1 + 5 + 1 + 1)의 피로도로 캘 수 있으며 이때가 최소값입니다.
입출력 예 #2
철 곡괭이로 다이아몬드 5개를 캐고 돌 곡괭이고 철 5개를 캐면 50의 피로도로 캘 수 있으며, 이때가 최소값입니다.
출처: 프로그래머스 코딩 테스트 연습, https://programmers.co.kr/learn/challenges
- cutCount -> 광물을 몇개 자를 수 있는지 5로 나눠서 올림 수로 구한다.
- maxLen -> 곡괭이 개수가 몇개인지 카운트
- mineral를 최대 자를 수 있는 것만 두고 나머지는 걷어냄.
- arr배열 생성하고, for문 진행(0부터 cutCount-1)까지
1) let obj = {diamond:0, iron:0, stone: 0} 선언
2) mineral을 5개씩 잘라서, 각 요소에 개수를 +1해준다.
3) arr에 다이아 곡갱이, 철 곡괭이, 돌 곡괭이로 그 값을 깼을때의 피로도 값 저장- 배열에는 5개씩 잘라서 각각 드는 피로도가 저장되있음.
- 이를 정렬한다. 철 곡괭이 기준으로 정렬. 오름차순
- 이후에 picks의 값을 하나씩 확인
- picks[i]번째 값을 pickCount로 받아서 -1씩 해줌. 0이 될때까지 아래과정 반복
answer+=arr.shift()[i]
-> i=0이면 다아이몬드 칼 쓴다. 따라서 arr에 뽑은 요소에 0번 인덱스 값을 뽑아내야 함으로 위에 코드와 같다.- 마지막에 answer을 리턴
function solution(picks, minerals) {
var answer = 0;
var cutCount = Math.ceil(minerals.length/5);
// 곡갱이 개수
let maxLen = picks.reduce((a, b) => a + b);
if (maxLen === 0) return 0;
// 최대 구할수 있는 개수 빼고 제거
minerals = minerals.splice(0,maxLen*5);
var arr = [];
for(var i = 0;i<cutCount;i++){
let obj = {diamond:0, iron:0, stone: 0};
minerals.splice(0,5).map((element)=>{
obj[element]++;
})
arr.push([obj.diamond+obj.iron+obj.stone,obj.diamond*5+obj.iron+obj.stone,obj.diamond*25+obj.iron*5+obj.stone])
}
arr = arr.sort((a, b) => b[2] - a[2])
for(var i = 0;i<picks.length;i++){
var pickCount =picks[i];
while(pickCount--){
if(arr.length ===0){
return answer;
}
answer+=arr.shift()[i];
}
}
return answer;
}
sean2337 님 알고리즘 정말 열심히 하시는것같아요.. 오늘도 좋은 풀이 잘 보고갑니다 !