Skip to content

Latest commit

 

History

History
64 lines (46 loc) · 3.37 KB

File metadata and controls

64 lines (46 loc) · 3.37 KB

과일 장수

프로그래머스

문제

과일 장수가 사과 상자를 포장하고 있습니다. 사과는 상태에 따라 1점부터 k점까지의 점수로 분류하며, k점이 최상품의 사과이고 1점이 최하품의 사과입니다. 사과 한 상자의 가격은 다음과 같이 결정됩니다.

한 상자에 사과를 m개씩 담아 포장합니다. 상자에 담긴 사과 중 가장 낮은 점수가 p (1 ≤ p ≤ k)점인 경우, 사과 한 상자의 가격은 p * m 입니다. 과일 장수가 가능한 많은 사과를 팔았을 때, 얻을 수 있는 최대 이익을 계산하고자 합니다.(사과는 상자 단위로만 판매하며, 남는 사과는 버립니다)

예를 들어, k = 3, m = 4, 사과 7개의 점수가 [1, 2, 3, 1, 2, 3, 1]이라면, 다음과 같이 [2, 3, 2, 3]으로 구성된 사과 상자 1개를 만들어 판매하여 최대 이익을 얻을 수 있습니다.

(최저 사과 점수) x (한 상자에 담긴 사과 개수) x (상자의 개수) = 2 x 4 x 1 = 8 사과의 최대 점수 k, 한 상자에 들어가는 사과의 수 m, 사과들의 점수 score가 주어졌을 때, 과일 장수가 얻을 수 있는 최대 이익을 return하는 solution 함수를 완성해주세요.

제한사항

  • 3 ≤ k ≤ 9
  • 3 ≤ m ≤ 10
  • 7 ≤ score의 길이 ≤ 1,000,000
    • 1 ≤ score[i]k
  • 이익이 발생하지 않는 경우에는 0을 return 해주세요.

제출 코드

function solution(k, m, score) {
  if (score.length < m) return 0;
  let totalIncome = 0;
  score.sort((a, b) => b - a);
  for (let i = m - 1; i < score.length; i += m) totalIncome += score[i] * m;
  return totalIncome;
}

기본 전제

  • score 배열과 m이 주어지면 만들 수 있는 사과 상자의 최대 개수는 고정되어 있다.
  • 사과 상자의 가격은 상자 안에 들은 사과 중 최하품의 가격으로 결정된다.
  • 따라서 가장 높은 등급의 사과부터 가장 낮은 등급의 사과까지 줄세운 다음, 높은 등급의 사과들부터 상자를 만들어나가면 최대 이익을 얻을 수 있다.

풀이 과정

  1. 총 이익을 0으로 초기화한다.
  2. 만약 m보다 score의 length가 작다면 바로 0을 반환한다.
  3. score 배열을 내림차순으로 정렬한다.
  4. m - 1부터 시작하여 score의 length - 1까지 m 간격으로 해당하는 요소를 찾는다. 예를 들어 m이 4라면 3, 7, 11, ... 이 해당하는 요소가 된다.
  5. 찾은 요소에 대해 요소 * m 연산을 한 결과를 총 이익에 더한다.
  6. 최종적으로 총 이익을 반환한다.

알고 가자

  • 자꾸 헷갈리는 배열의 sort() 메소드 사용법.
  • 오름차순으로 정렬하고자 할 경우(배열의 모든 요소가 number라는 가정 하에) 콜백 함수에서 a - b를 반환한다. sort 메소드는 콜백 함수가 0보다 작은 값을 반환하면 a, b 순서를 그대로 유지하기 때문이다.
  • 내림차순으로 정렬하고자 할 경우 콜백 함수에서 b - a를 반환한다. sort 메소드는 콜백 함수가 0보다 큰 값을 반환하면 a, b 순서를 b, a로 바꾸기 때문이다.
const numbers = [3, 2, 4, 1];

numbers.sort((a, b) => a - b); // 오름차순 정렬
numbers.sort((a, b) => b - a); // 내림차순 정렬