코테

[leetcode] Two Sum

AnnSEo2105 2021. 10. 26. 13:11

추천 받은 릿코드

 

 

트위터에서 누가 530일 동안 매일 알고리즘을 풀었다고 쓴 글을 봤다.

나도 매일매일 하루 한 문제라도 꼭 풀어봐야겠다.

 

 

 

오늘 처음 한 문제 풀어봤다.

 

인프런으로 자바스크립트 코딩 테스트 강의를 듣고 있는데 섹션10까지 있는데 이제 2까지 들었다.

이것도 병행해서 매일 풀어볼까 한다. Easy만 522문제나 있네 와우

 

10문제씩 풀면 2달에 풀 지 않을까

 

여튼 그렇게 먼저 도전한 문제는 Two Sum이다.

난이도를 Easy에 고정하고 풀었다.

 

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

 

Two Sum - LeetCode

Level up your coding skills and quickly land a job. This is the best place to expand your knowledge and get prepared for your next interview.

leetcode.com

 

 

최근에 배운대로 먼저 좀 생각해보고 어렵지 않은 문제 같아서 바로 코딩했다.

/**
 * @param {number[]} nums
 * @param {number} target
 * @return {number[]}
 */
var twoSum = function(nums, target) {
    let answer = [];
    
    for(let i=0; i < nums.length; i++){
        for(let j= i+1; j < nums.length; j++){
            if((nums[i]+nums[j]) === target){
                answer.push(i)
                answer.push(j)
            }
        }
    }
    return answer;
};

 

처음 제출 때 아무 생각 없이 nums.length -1을 썼다가 중간에 있는 테스트에서 걸렸다. 뭐지? 하고 보니 내가 무의식적으로 -1을 붙였군 싶었다.

새벽에 코딩하면 안된다.

 

여튼 이렇게 문제 풀었는데 보니까 토론 게시판이 있었다.

 

 

굉장히 싱크빅한 코드를 봤는데 순간 어떤 코드인지 잘 해석이 안됐다.

 

const twoSum = (nums, target) => {
  const map = {};

  for (let i = 0; i < nums.length; i++) {
    const another = target - nums[i];

    if (another in map) {
      return [map[another], i];
    }

    map[nums[i]] = i;
  }

  return null;
};

보니까 첫 반복 돌 때, another에 타겟값에서 nums배열의 첫 번째 값을 빼고, map은 비어서 if문이 안도는 거 같고, map[nums[i]] = i 에서 {'값': '인덱스'} 요런 식으로 들어가는 거 같다.

두 번째 반복 돌 때, another에 타겟값에서 nums배열의 두 번째 값을 빼고, 이번에는 map이 있는데 그 안에 another가 있으면 map의 값과 현재의 nums[i]를 더한게 target이니까 원하는 값을 찾은 거다. 인덱스를 배열에 담아 리턴하라 했으니 map에 another 값으로 인덱스를 찾고, 지금의 i를 두 번째에 담아주면 된다. 안나오면 다시 map에 두번째 값과 인덱스를 넣어준다.

 

 

이렇게 하면 이중 for문을 돌지 않아도 되네!! 와우!

뭔가 배열에 익숙하지 않기도 한데 이런 생각은 어떻게 하는 거지?

 

 

이렇게 첫 릿코드 후기였다.

야호~!