Computer >> 컴퓨터 >  >> 프로그래밍 >> JavaScript

자바스크립트에서 배열에서 합이 특정 숫자가 되는 두 수를 찾는 가장 좋은 방법

문제 상황

다음과 같은 배열이 있다고 가정해 보겠습니다.

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를 반환합니다.