🧬알고리즘/Programmers

[JavaScript] 과일 장수

뉴발자 2024. 9. 24.
728x90

 

 

 

 

 

 

 

 

 

 

 

 

 

 

[JavaScript] 과일 장수

 

 

문제

과일 장수가 사과 상자를 포장하고 있습니다.

 

사과는 상태에 따라 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가 주어졌을 때,

 

과일 장수가 얻을 수 있는 최대 이익을 반환하는 함수를 완성해주세요.

 

 

예시

k m score return
3 4 [1, 2, 3, 1, 2, 3, 1] 8
4 3 [4, 1, 2, 2, 4, 4, 4, 4, 1, 2, 4, 2] 33

 

 

나의 풀이

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

 

 

풀이 방법

1. 결과 값을 담을 변수를 score를 내림차순으로 정렬한 배열을 생성해준다.

function solution(k, m, score) {
  // 1
  let result = 0, i = 0;
  const sorted = score.sort((a, b) => b - a);
}

 

2. 변수 i의 값이 score의 크기보다 커질 때까지 while() 문을 사용해서 결과 값 계산을 반복해준다.

 2-1. 만약 상자에 담을 사과의 갯수(m)가 score의 크기보다 크다면 반복문을 종료하고 0을 리턴한다.

 2-2. score[i+m-1]의 값이 있다면(남은 사과의 개수가 m개가 된다면) result에 계산한 값을 더해준다.

 2-3. m개 이후의 첫 번째 값을 찾기위해 i에 m의 값을 더해준다.

function solution(k, m, score) {
  let result = 0, i = 0;
  const sorted = score.sort((a, b) => b - a);
  
  // 2
  while (i < score.length) {
    // 2-1
    if (score.length < m) break;
    
    // 2-2
    if (score[i+m-1]) result += score[i+m-1] * m;
    
    // 2-3
    i += m;
  }
  
  return result;
}

 

 

 

 

 

 

 

 

 

 

728x90

댓글