[leetcode] twoSum

Winney·2021년 9월 1일
0

문제 :https://leetcode.com/problems/two-sum/

해결방법

const twoSum = (nums, target) => {
  const arr =[];
  for (let i = 0; i < nums.length; i++) {
    for (let j = i + 1; j < nums.length; j++) {
      if (nums[i] + nums[j] === target) {
        arr.push(i);
        arr.push(j);
      }
    }
  }
  return arr
}

수정

const twoSum = (nums, target) => {
  const arr = [];
  nums.forEach((num,i) => {
    nums.forEach((num, j) => {
      if (j > i && nums[i] + nums[j] === target)
        arr.push(i, j);
    })
  })
  return arr;
}

기존의 for문 대신 forEach를 사용하는 방법으로 수정해보았다.
어디선가 for문은 촌스럽다!하는 글을 보고 시도해보았지만 runtime은 3배쯤 증가하고 memory도 0.5MB쯤 더 사용하는 것을 보고 그냥 촌스럽게 써야겠다는 생각을 했다.

참고로 if 안에 j > i를 넣은 건 해당 조건을 넣지 않을 경우 중복되는 경우의 수가 나오기 때문이다.

for문을 통해 배열을 2개 놓고 하나씩 짝지어가며 비교하는 거라 O(n^2)만큼의 시간이 걸린다.

다른 풀이를 보니 hash table을 사용한 방법도 있었다. 당연하지만 나는 생각 못 했다ㅋㅋ....

해당 블로그에서 hash table을 사용한 방법을 more elegant solution이라고 말하는데 나도 곧 그런 elegant solution을 먼저 생각하는 날이 올거라 믿는다.

hash table 사용

const twoSum = (nums, target) => {
  const hash = {};
  for (let i = 0; i < nums.length; i++) {
    const otherNum = target - nums[i];
    if (hash[otherNum] !== undefined) {
      return [hash[otherNum], i];
    }
    hash[nums[i]] = i;
  }
}

for문을 한 번 쓰다보니 O(n)만큼의 시간이 걸린다.
어떤 때에 hash table을 써야하는지 다시 한 번 기억할 기회였다.

profile
프론트엔드 엔지니어

0개의 댓글