문제 설명
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보다 작아지는 순간, 남은 바나나를 모두 현재 사람에게 지급하고 결과 배열을 반환하며 함수가 종료됩니다.