이번 글에서는 첫 번째 인수로 숫자 배열(arr)을, 두 번째 인수로 하나의 숫자(num)를 받는 자바스크립트 함수를 작성해 보겠습니다.
이 함수의 목표는 다음 조건을 만족하는 모든 쌍을 배열에서 찾아내는 것입니다.
arr[i] + arr[j]가 num으로 나누어 떨어지고,
i < j
즉, 두 요소의 합이 num의 배수가 되면서, 앞쪽 요소의 인덱스가 뒤쪽 요소의 인덱스보다 작은 경우를 모두 찾으면 됩니다.
예시
입력 배열과 숫자가 다음과 같다고 가정해 보겠습니다.
const arr = [1, 2, 3, 4, 5, 6];
const num = 4;
이때 기대되는 출력은 다음과 같습니다.
const output = [
[1, 3], [2, 6], [3, 5]
];
[1, 3]의 합은 4, [2, 6]의 합은 8, [3, 5]의 합은 8로, 세 쌍 모두 4로 나누어 떨어지므로 정답에 포함됩니다.
구현 코드
이 문제는 중첩 반복문을 사용해 해결할 수 있습니다. 바깥쪽 반복문은 i를 순회하고, 안쪽 반복문은 j를 i+1부터 순회하며 각 쌍의 합이 num으로 나누어 떨어지는지 확인합니다. 조건을 만족하면 해당 쌍을 결과 배열에 추가합니다.
const arr = [1, 2, 3, 4, 5, 6];
const num = 4;
const divisibleSumPairs = (arr = [], num) => {
const res = [];
const { length } = arr;
for(let i = 0; i < length; i++){
for(let j = i + 1; j < length; j++){
const sum = arr[i] + arr[j];
if(sum % num === 0){
res.push([arr[i], arr[j]]);
}
}
}
return res;
};
console.log(divisibleSumPairs(arr, num));
출력 결과
콘솔에 출력되는 결과는 다음과 같습니다.
[ [ 1, 3 ], [ 2, 6 ], [ 3, 5 ] ]
동작 원리와 성능
이 코드는 배열 내 모든 가능한 쌍을 검사하므로 시간 복잡도는 O(n²)입니다. 배열 크기가 작거나 중간 정도라면 충분히 효율적이지만, 매우 큰 배열을 다룰 때는 각 요소를 num으로 나눈 나머지를 미리 계산해 그룹화하는 방식으로 O(n)까지 최적화할 수 있습니다. 또한 나머지 연산 시 음수 처리에 주의해야 하며, 필요하다면 ((sum % num) + num) % num 형태로 보정하는 것이 안전합니다.