Computer >> 컴퓨터 >  >> 프로그래밍 >> JavaScript

JavaScript로 바나나 분배 문제 해결하기


문제 설명

n명의 사람이 한 줄로 서 있다고 가정해 봅시다. 우리는 다음과 같은 방식으로 이들에게 바나나를 배분하려고 합니다.

  • 첫 번째 사람에게 1개, 두 번째 사람에게 2개를 주는 식으로, 마지막 n번째 사람에게 n개의 바나나를 줍니다.

  • 그다음 다시 줄의 맨 앞으로 돌아가서, 첫 번째 사람에게 n+1개, 두 번째 사람에게 n+2개를 주는 식으로 마지막 사람에게 2 * n개의 바나나를 줍니다.

  • 이 과정은 바나나가 모두 소진될 때까지 반복됩니다(매 차례마다 하나씩 더 주고, 줄의 끝에 도달하면 다시 처음으로 이동). 바나나가 부족해지면 마지막 사람이 남은 바나나를 모두 받게 됩니다.

우리는 JavaScript 함수를 작성해야 합니다. 이 함수는 첫 번째 인수로 사람 수 num을, 두 번째 인수로 바나나 개수 m을 받습니다.

그리고 함수는 바나나의 최종 분배 결과를 나타내는 배열(길이 num)을 반환해야 합니다.

예를 들어, 함수에 다음과 같이 입력한다고 가정해 봅시다.

const num = 3;
const m = 10;

그렇다면 출력 결과는 다음과 같아야 합니다.

const output = [5, 2, 3];

출력 결과 해설

첫 번째 차례에서 res[0] += 1이 실행되고, 배열은 [1, 0, 0]이 됩니다.

두 번째 차례에서 res[1] += 2가 실행되고, 배열은 [1, 2, 0]이 됩니다.

세 번째 차례에서 res[2] += 3이 실행되고, 배열은 [1, 2, 3]이 됩니다.

네 번째 차례에서 res[0] += 4가 실행되고, 최종 배열은 [5, 2, 3]이 됩니다.

구현 예제

이를 구현한 코드는 다음과 같습니다.

const num = 3;
const m = 10;
const distributeBananas = (num = 1, m = 1) => {
    const res = new Array(num).fill(0);
    let curr = 1;
    while(true){
        for(let i = 0; i < num; i++){
            if(m < curr){
                res[i] += m
                return res
            };
            res[i] += curr;
            m -= curr;
            curr++;
        };
    };
};
console.log(distributeBananas(num, m));

실행 결과

콘솔에 출력되는 결과는 다음과 같습니다.

[5, 2, 3]

이 코드의 핵심 로직은 curr 변수로 현재 지급해야 할 바나나 개수를 추적하고, while 루프와 for 루프를 조합해 줄을 순환하며 배분하는 것입니다. 남은 바나나 수 m이 이번에 지급해야 할 개수 curr보다 작아지는 순간, 남은 바나나를 모두 현재 사람에게 지급하고 결과 배열을 반환하며 함수가 종료됩니다.