코딩테스트(JavaScript) Leetcode : 1. Two Sum

Parkboss·2022년 10월 19일
0

코딩테스트

목록 보기
16/19

✅문제

Given an array of integers nums and an integer target, return indices of the two numbers such that they add up to target.

You may assume that each input would have exactly one solution, and you may not use the same element twice.

You can return the answer in any order.

정수의 배열의 nums와 타켓이 주어질 때, 두 수의 합이 target이 되는 두 개의 인덱스를 반환하여라.
하나의 입력값에 하나의 솔루션만 있다고 가정하고, 같은 요소를 두번 사용할 수 없다.
값을 어떤 순서로든 반환할 수 있다.

📢 입출력 예제

Example 1:

Input: nums = [2,7,11,15], target = 9
Output: [0,1]
Explanation: Because nums[0] + nums[1] == 9, we return [0, 1].

Example 2:

Input: nums = [3,2,4], target = 6
Output: [1,2]

Example 3:

Input: nums = [3,3], target = 6
Output: [0,1]

💻 내 풀이

var twoSum = function(nums, target) {

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

맨 처음에는 let j = 1로 해서 풀었는데 첫 번째 예제는 맞았지만 두 번째에서는 wrong이라고 떴다!
생각해 보니 두 번째 예제에서 if에서 nums[0]+nums[j] == targer 즉, 3 + 2 = 6은 false이기 때문에 다시 for 문으로 올라간다.
첫 번째 for 문에서 증감하여 i = 1인 상태로 if 문으로 내려간다.

여기서❗첫 번째 for 문을 다 돌고 나서야 그다음 두 번째 for 문이 증감이 된다!
이 부분은 항상 까먹는구나!!!!!!!!

input = [3,2,4], target = 6

var twoSum = function(nums, target) {

    for(let i = 0; i < nums.length; i++){
    for(let j = 1; j < nums.length; j++){
        if(nums[i]+ nums[j] == target){
          // 3+2 == 6 false (틀린 방법)
          // 2+2 == 6 false
          // 4+2 == 6은 맞지만 output에서 [1,2]의 인덱스가 나와야된다!
          // 첫번째 for문을 다돌아야 그 다음 두번째 for문이 증감이 된다는 말이다!
          // 3+2 == 6
          // 3+4 == 6
          // 3 < 3 false 이므로 종료가 된다.
            return [i,j]
          //let j = i+1일때 (맞는 방법)
          // 3 + 2 == 6 false
          // 2 + 4 == 6 true [1,2] 니깐 for문 종료
        }
    }
    }
}

그래서 i+1을 해줘야 첫번째 for문을 돌때 두번째 for문도 같이 +1을 해줘서 두번째 예제의 [1,2]가 나온다.

💻 다른 사람 풀이

var twoSum = function(nums, target) {
    
    const hash = new Map();
    
    for( let i = 0 ; i < nums.length; i++) {
        // 1. target을 만들 수 있는 수 찾기
        const find = target - nums[i];
        
        // 2. target을 만들 수 있는 수를 찾는다면, 리턴
        if(hash.get(find) !== undefined)  return [hash.get(find), i];
        
        // 3. target을 만들 수 있는 수를 못찾았다면, 자신을 맵에 등록.
        hash.set(nums[i], i);
    }
    
    return [];
}

1. Loop - Step 1 (index= 0)

nums[0] 의 값은 2이고, 어떤 수를 더했을 때 9(target)이 되는지 찾는다.(find).
find는 7이고, hash에 7이란 값이 존재하는지 확인한다.

아직 hash에는 값이 비어있으므로 7을 찾을 수 없어서, nums[0]의 값을 기억해 두기 위해 hash에 저장해둔다.

2. Loop - Step 2 (index= 1)

nums[1] 의 값은 7이고, 어떤 수를 더했을때 9(target)이 되는지 찾는다.(find).
find 2이고, hash에 2란 값이 존재하는지 확인한다.

hash에서 2를 찾을 수 있으며, [hash.get(find),index]를 [0,1] 리턴하면 완료!

hashMap출처

hash를 사용하여 간단하게 풀 수도 있구나.. 위에 그림들을 그려보면서 설명을 적으니 이해가 간다
참 신기한 알고리즘 세계이다

profile
ur gonna figure it out. just like always have.

0개의 댓글