-
프로그래머스 - 과일 장수Algorithm 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 }
'Algorithm' 카테고리의 다른 글
프로그래머스 - [1차] 비밀지도 (0) 2023.05.20 프로그래머스 - 신규 아이디 추천 (0) 2023.05.15 프로그래머스 - 신고 결과 받기 (1) 2023.05.12 프로그래머스 - 체육복 (0) 2023.05.06 프로그래머스 - [카카오 인턴] 키패드 누르기 (0) 2023.05.06