안녕하세요

프로그래머스 JS [과일 장수] 본문

프로그래머스/Lv.1

프로그래머스 JS [과일 장수]

sakuraop 2023. 1. 19. 01:20

과일 장수

1. 필요한 조건 정리

  • 사과는 상태에 따라 1점부터 k점까지의 점수로 분류한다.
  • k점이 최상품의 사과 점수
  • p점이 최하품의 사과 점수
  • 한 상자에 m개 포장
  • 사과 한 상자의 가격은 p * m
  • 최대 이익을 계산 (사과는 상자 단위로만 판매, 남는 사과는 버립니다)

2. 풀이 단계 정리

  • (1) 고렴이 > 저렴이 순서로 배치하기
  • (2) 앞에서부터 m개씩( 가장 비싼 사과끼리 ) 상자에 담기
  • (3) 사과 m개를 상자에 담았으면 상자의 마지막 사과(p) * 사과갯수(m)을 가격에 더하기
  • (4) 마지막 상자에 3개보다 사과가 덜 담긴다면 총 가격을 구하기

3. 코드로 옮기기

function solution(k, m, score) {
  // (1)고렴이 > 저렴이 순서로 배치하기
  const 고렴이우선배열 = score.sort((a, b) => b - a);
  //   console.log 찍어서 잘 나타나는지 확인하기
  //   console.log(고렴이우선배열);
  //   [
  //     4, 4, 4, 4, 4,
  //     4, 2, 2, 2, 2,
  //     1, 1
  //   ]

  let box = [];
  let money = 0;

  for (let i = 0; i < 고렴이우선배열.length; i++) {
    // (2)앞에서부터 m개씩( 가장 비싼 사과끼리 ) 나누어 상자에 담기
    box.push(고렴이우선배열[i]);
 
    // 사과 m개를 상자에 담았으면
    if (box.length === m) {
 
      // (3)상자의 마지막 사과(p) * 사과갯수(m)을 가격에 더하기
      money += box[m - 1] * m;
 
      //   박스 console.log 찍어서 잘 나타나는지 확인하기
      //   console.log(box);
      // [ 4, 4, 4 ]
      // [ 4, 4, 4 ]
      // [ 2, 2, 2 ]
      // [ 2, 1, 1 ]
 
      // 다음 상자 가져오기
      box = [];
    }
  }
  // (4) 마지막 상자에 3개보다 사과가 덜 담긴다면 총 가격을 구하기
  //   console.log(money);
  return money;
}

solution(3, 4, [1, 2, 3, 1, 2, 3, 1]);

 


function solution(k, m, score) {
  const 고렴이우선배열 = score.sort((a, b) => b - a);
  
  let box = [];
  let money = 0;

  for (let i = 0; i < score.length; i++) {
    box.push(score[i]);
    if (box.length === m) {
      money += box[m - 1] * m;
      box = [];
    }
  }
  return money;
}

solution(3, 4, [1, 2, 3, 1, 2, 3, 1]);

다른 사람 풀이 ( Programmers: GomiLim 님 )

function solution(k, m, score) {
    var answer = 0;
    // 한 상자에 넣을 수 있는 사과 갯수로 전체 사과 갯수를 나눠 만들 수 있는 박스 수를 구한다.
    const boxCount = Math.floor(score.length / m);

    // 버릴 사과 갯수를 구한다.
   const inavailableApple =   score.length % m;
    // 점수를 오름차순으로 정리해서 앞에서부터 불필요한 사과 갯수만큼 제거한다.
   const apples = [...score].sort();
   apples.splice(0,inavailableApple);

    // 트럭에 뒤에서부터 count만큼씩 잘라서 박스에 넣은다음 트럭에 싣는다.
     const packing = (array, box, count) => {
      const truck = [];
        for (let i =0; i < box; i++) {
            const miniBox = array.splice(array.length-count, count);
            truck.push(miniBox);
        }
         return truck;

         /*
         0 [4, 4, 4] [[4, 4, 4]]
         1 [4, 4, 4] [[4, 4, 4], [4, 4, 4]]
         2 [2, 2, 2] [[4, 4, 4], [4, 4, 4], [2, 2, 2]]
         3??

         0 [2, 2, 3, 3], [[2, 2, 3, 3]]
         1 []
         2
         3
         4??
         */
    }

    const truck= packing(apples,boxCount, m);
    // 완성!
    const result = truck.forEach(box => {
        const findMinScore = Math.min(...box) ?? 0;
        answer += findMinScore * m * 1;
    })

    return answer;
}