문제 정의
항상 0에서 시작하여 양의 정수 n에서 끝나는 구간이 있다고 가정해 보겠습니다. 이 구간은 배열 형태로 다음과 같이 표현할 수 있습니다.
const interval = [0, n];
범위가 항상 0에서 시작한다는 점을 이미 알고 있으므로, 더 간단하게 상한값만으로 구간을 나타낼 수도 있습니다.
const interval = n;
요구 사항
두 개의 숫자를 각각 첫 번째, 두 번째 인수로 받는 JavaScript 함수를 작성해야 합니다.
첫 번째 인수는 0부터 해당 숫자까지의 구간을 의미하고, 두 번째 숫자는 실제 구간을 몇 개의 동일한 간격으로 나눌지 결정합니다(가능한 경우).
예를 들어 입력값이 3과 2라고 해보겠습니다. 이때 실제 구간은 [0, 3], 즉 [0, 1, 2, 3]이며, 이를 가능하다면 2개의 동일한 구간으로 나눠야 합니다.
따라서 위 입력에 대한 출력 결과는 다음과 같습니다.
const output = [ [0, 1], [2, 3] ];
단, 각 구간의 상한과 하한은 항상 정수여야 한다는 점에 유의해야 합니다.
구현 코드
const getIntervals = (interval, num) => {
const size = Math.floor(interval / num);
const res = [];
for (let i = 0; i <= interval; i += size) {
const a = i === 0 ? i : (i += 1);
const b = i + size > interval ? interval : i + size;
if (a < interval) {
res.push([a, b]);
}
}
return res;
};
console.log(getIntervals(3, 2));
출력 결과
콘솔에 출력되는 결과는 다음과 같습니다.
[ [0, 1], [2, 3] ]
코드 동작 원리
이 함수가 어떻게 동작하는지 단계별로 살펴보겠습니다.
- 간격 크기 계산:
Math.floor(interval / num)을 사용해 전체 구간을 원하는 개수로 나눈 뒤 소수점 이하를 버립니다. 예제에서는 3 ÷ 2 = 1.5이므로 각 구간의 크기는 1이 됩니다. - 반복 처리: 시작점 0부터 구간의 끝까지 간격 크기만큼 이동하며 반복합니다.
- 시작점 조정: 첫 번째 구간은 0에서 시작하지만, 이후 구간은 이전 구간의 마지막 숫자와 겹치지 않도록 시작값에 1을 더해 중복을 방지합니다.
- 종료점 제한: 계산된 종료점이 전체 구간의 상한을 초과하면 상한값으로 고정해 범위를 벗어나지 않도록 합니다.
- 유효성 검사: 시작값이 구간의 상한보다 작은 경우에만 결과 배열에 추가해 불필요한 구간이 생기지 않게 합니다.