Algorithm
프로그래머스 - 과일 장수
b._.omi
2023. 5. 12. 16:00

문제

풀이
처음 풀고자 했던 의도는 score 배열을 내림차순으로 정렬한 뒤, 0번째 인덱스부터 m개씩 만큼 뽑아 최솟값을 구한뒤 m을 곱한 값들을 다 더하면 될 거라고 생각했다
function solution(k, m, score) {
let answer = 0;
let slicedScore = [];
// 내림차순 정렬
score.sort((a, b) => b - a);
for(let i = 0; i < score.length; i++){
// 0혹은 m번째 인덱스면서 score.length-i가 m-1보다 크다면 즉, 남은 개수가 m개 이상일 때
if((i%m===0) && (score.length-i > m-1)) {
// score 배열의 i번째 인덱스 값부터 i+m-1번째 인덱스 값까지 뽑아 최소값*m 푸쉬
slicedScore.push(Math.min(...score.filter((_, idx) => idx >= i && idx <= i+m-1))*m);
}
}
// slicedScore 배열요소들의 합
return slicedScore.reduce((cal, cur) => cal + cur);
}
하지만, score 배열의 최대 길이가 100만인 조건 때문에 for문 안의 Math.min과 filter는 효율이 굉장히 좋지 못했다

두번째 풀이
풀이법을 다시 고민하던 와중 push와 pop을 할 때 시간복잡도는 O(1)이라는 사실을 알게 되어서 push와 pop을 활용하기로 했다
function solution(k, m, score) {
let answer = 0;
// score 배열 오름차순 정렬
score.sort((a, b) => a - b);
// score 배열 길이가 m보다 작아질 때 까지 반복
while(score.length >= m) {
let initArray = [];
// score 배열의 마지막요소를 뽑아 initArray에 푸쉬
for(let i = 0; i < m; i++){
initArray.push(score.pop());
}
// initArray의 마지막 요소 * m 을 answer에 더해준다
answer += initArray[initArray.length-1]*m;
}
return answer
}
