TwoSum


**문제** Write a function that takes an array of numbers (integers for the tests) and a target number. It should find two different items in the array that, when added together, give the target value. The indices of these items should then be returned in an array like so: [index1, index2].

For the purposes of this kata, some tests may have multiple answers; any valid solutions will be accepted.

The input will always be valid (numbers will be an array of length 2 or greater, and all of the items will be numbers; target will always be the sum of two different items from that array).

인자로 숫자로 이루어진 배열과 타겟값을 받습니다. 배열 내 두 수를 더한 값이 타겟값과 일치한다면 두 수의 인덱스를 배열로 반환하는 함수를 작성하는 문제입니다. 이전에도 유사한 알고리즘 문제를 풀었었던 것 같은데, 저는 n이 배열의 길이일 때 시간복잡도 O(n)으로 알고리즘을 풀기 위해 아래와 같이 객체를 문제를 풀었습니다.

function twoSum(numbers, target) {
  const seen = {};

  for (let i = 0; i < numbers.length; i++) {
    if (seen[numbers[i]] !== undefined) {
      return [seen[numbers[i]], i];
    } else {
      const lookFor = target - numbers[i];
      seen[lookFor] = i;
    }
  }
}

Loop를 한 번 돌면서 현재의 값과 짝을 이루었을 때 타겟값이 되는 숫자를 객체의 key 값으로, 인덱스를 값으로 저장한 후 loop를 돌면 앞에서 찾던 짝과 일치하는 숫자를 만나면 두 수의 인덱스를 반환했습니다. 언더스코어의 메모이즈를 응용해 찾는 값을 캐싱하면 쉽게 풀 수 있는 문제였습니다. 다른 알고리즘 문제도 이렇게 쉽게 풀 수만 있으면 너무나 행복할 것 같습니다..ㅜ