-
[문제풀이 후기] 프로그래머스 #135808 - 과일 장수문제풀이/Programmers 2026. 4. 1. 19:37
https://school.programmers.co.kr/learn/courses/30/lessons/135808
기본 상위 코드
const [k, m, score] = [4, 3, [4, 1, 2, 2, 4, 4, 4, 4, 1, 2, 4, 2]]; let result = 0;첫 번째 시도 (결과 : 성공)
접근 방식
1. k 이하인 값만 필터링 후 내림차순 정렬
2. 필터링된 배열이 개수 < m 인 경우 return 0
3. m 개씩 묵어서 최소값 * m 을 하여 result 에 합산const filteredScore = score.filter((value) => value <= k).sort((a, b) => b - a); if (filteredScore.length < m) return 0; for (let i = 0; i <= filteredScore.length - m; i += m) { const box = filteredScore.slice(i, i + m); result += Math.min(...box) * m; } return result;
포인트
1. 최대 이익
: 최대 이익을 얻기 위해서는 최대값끼리 묶어야 함
→ m 개씩 묶었을 때, 묶이지 않는 값들은 최소값이어야 함
2. 묶이지 않는 값 분리
: 배열을 m 으로 나눈 나머지 값을 활용
: 정렬된 배열을 slice 로 필터링 가능
(오름차순 정렬이 이후 작업에 있어서 내림차순 정렬보다 더 편리)
3. 합산 방법
: 오름차순 정렬된 각 묶음의 최소값 = 각 묶음의 첫 index
4. 기타
: 1 ≤ score[i] ≤ k 이므로, k 이하인 값을 필터링하는 과정 불필요
: 기본 result 가 0 이므로 얼리 리턴 로직 불필요두 번째 시도 (결과 : 성공)
접근 방식
1. 오름차순 정렬 후 m 으로 나눈 나머지 값을 slice 로 필터링
2. 각 묶음의 최소값 index 를 반복문으로 합산const sortedScore = score.sort((a, b) => a - b).slice(score.length % m); for (let i = 0; i < sortedScore.length; i += m) { result += sortedScore[i] * m; } return result;효과
메모리 : 101 MB -> 90.4 MB
시간 : 276.06 ms -> 224.25 ms후기
문제를 잘 읽자
'문제풀이 > Programmers' 카테고리의 다른 글
[문제풀이 후기] 프로그래머스 #12921/#120846 - 소수 찾기/합성수 찾기 (0) 2026.04.07 [문제풀이 후기] 프로그래머스 #161989 - 덧칠하기 (0) 2026.04.01 [문제풀이 후기] 프로그래머스 #17681 - [1차] 비밀지도 (0) 2026.03.13 [문제풀이 후기] 프로그래머스 #159994 - 카드 뭉치 (0) 2026.03.13 [문제풀이 후기] 프로그래머스 #138477 - 명예의 전당 (1) (0) 2026.03.04