December 7th 2018
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를 돌면 앞에서 찾던 짝과 일치하는 숫자를 만나면 두 수의 인덱스를 반환했습니다. 언더스코어의 메모이즈를 응용해 찾는 값을 캐싱하면 쉽게 풀 수 있는 문제였습니다. 다른 알고리즘 문제도 이렇게 쉽게 풀 수만 있으면 너무나 행복할 것 같습니다..ㅜ