문제 상황
다음과 같은 배열이 있다고 가정해 보겠습니다.
var numbers = [10, 3, 40, 50, 20, 30, 100];
이 배열의 요소 중에서 서로 다른 두 숫자를 골라 그 합이 80이 되는 쌍(pair)을 찾아야 합니다.
가장 단순한 방법은 모든 조합을 비교하는 이중 반복문이지만, 이 경우 시간 복잡도가 O(n²)로 비효율적입니다. 더 나은 방법은 객체(해시 맵)를 활용하여 단 한 번의 반복(O(n))만으로 원하는 두 숫자를 찾는 것입니다.
예제 코드
function specificPairsOfSumOfTwoNumbers(numbers, totalValue) {
var storeTwoNumbersObject = {};
for (var currentNumber of numbers) {
if (storeTwoNumbersObject[currentNumber]) {
return {
firstNumber: totalValue - currentNumber,
secondNumber: currentNumber
};
}
storeTwoNumbersObject[totalValue - currentNumber] = true;
}
return false;
}
var numbers = [10, 3, 40, 50, 20, 30, 100];
console.log("합이 80인 두 숫자 = ");
console.log(specificPairsOfSumOfTwoNumbers(numbers, 80));동작 원리
이 알고리즘은 다음과 같은 논리로 작동합니다.
1. 배열을 순회하면서 현재 숫자에 대해 "목표 값에서 현재 숫자를 뺀 보완 값(complement)"을 계산합니다.
2. 보완 값을 객체에 키(key)로 저장해 둡니다.
3. 이후 순회 과정에서 어떤 숫자가 이미 저장된 보완 값과 일치하면, 그 숫자와 보완 값의 원본 숫자가 바로 우리가 찾는 쌍입니다.
4. 끝까지 일치하는 값이 없으면 false를 반환합니다.
이 방식은 각 요소를 한 번씩만 확인하므로 시간 복잡도가 O(n)이며, 배열이 클수록 이중 반복문보다 훨씬 빠른 성능을 보여줍니다.
실행 방법
위 프로그램을 실행하려면 Node.js 환경에서 다음 명령어를 사용합니다.
node fileName.js
여기서는 파일 이름이 demo207.js라고 가정합니다.
node demo207.js
실행 결과
위 코드를 실행하면 다음과 같은 출력을 얻을 수 있습니다.
PS C:\Users\Amit\javascript-code> node demo207.js
합이 80인 두 숫자 =
{ firstNumber: 50, secondNumber: 30 }
결과를 보면 배열에서 50 + 30 = 80을 만족하는 두 숫자를 성공적으로 찾아낸 것을 확인할 수 있습니다. 만약 조건을 만족하는 쌍이 존재하지 않는다면 함수는 false를 반환합니다.