이번 글에서는 숫자 배열을 첫 번째 인수로, 하나의 숫자를 두 번째 인수로 받는 JavaScript 함수를 작성해 보겠습니다. 이 함수는 배열 안에서 연속적이든 비연속적이든, 세 숫자의 합이 두 번째 인수로 지정한 값과 일치하는 모든 트리플렛(triplet, 세 수 조합)을 찾아 배열 형태로 반환해야 합니다.
예를 들어 입력 배열과 목표 숫자가 다음과 같다면 −
const arr = [4, 2, 0, 1, 2, 6, 8, 3, 2, 5]; const num = 8;
기대되는 출력 결과는 다음과 같습니다 −
const output = [ [ 2, 2, 4 ], [ 1, 3, 4 ], [ 0, 2, 6 ], [ 1, 2, 5 ] ];
구현 예제
다음은 위 문제를 해결하는 전체 코드입니다 −
const arr = [4, 2, 0, 1, 2, 6, 8, 3, 2, 5];
const num = 8;
const tripletSum = (arr, num) => {
if (arr.length === 3) {
if (arr[0]+arr[1]+arr[2] === 0) {
return [[arr[0],arr[1],arr[2]]];
};
};
const results = [];
const hashMap = {};
for (var i=0; i<arr.length; i++) {
for (var j=i+1; j<arr.length; j++) {
for (var k=j+1; k<arr.length; k++) {
if (arr[i]+arr[j]+arr[k] === num) {
if (!hashMap[arr[i]*arr[j]*arr[k]]) {
results.push([arr[i],arr[j],arr[k]]);
results[results.length-1].sort();
hashMap[arr[i]*arr[j]*arr[k]] = true;
}
}
}
}
}
return results;
};
console.log(tripletSum(arr, num));출력 결과
위 코드를 실행하면 콘솔에 다음과 같은 결과가 출력됩니다 −
[ [ 2, 2, 4 ], [ 1, 3, 4 ], [ 0, 2, 6 ], [ 1, 2, 5 ] ]
코드 동작 원리
이 알고리즘은 세 개의 중첩 반복문을 사용해 배열에서 만들 수 있는 모든 세 숫자 조합을 하나씩 검사합니다. 각 조합의 합이 목표 값 num과 일치하면 해당 조합을 결과 배열에 추가하는데, 이때 hashMap 객체에 세 숫자의 곱을 키로 저장하여 동일한 조합이 중복 등록되지 않도록 처리합니다. 또한 각 조합을 오름차순으로 정렬해 일관된 형태의 결과를 제공하며, 최종적으로 완성된 결과 배열을 반환합니다.