본문 바로가기
D.evelop [CS]/Algorithm

[Algorithm 005] JS - twoSum

by Danne 2021. 9. 14.

Q. twoSum함수에 숫자배열과 '특정 수'를 인자로 넘기면, 두 값을 더해서 '특정 수(target)'가 나오는 index를 배열에 담아 return하기

nums: 숫자 배열
target: 두 수를 더해서 나올 수 있는 합계
return: 두 수의 index를 가진 숫자 배열

# target으로 보내는 합계의 조합은 배열 전체 중에 2개 밖에 없다고 가정

 

예)

nums = [4, 9, 11, 14] 
target = 13

위의 값이 주어질 경우
nums[0] + nums[1] = 4 + 9 = 13  이므로  
[0, 1]이 return 되어야 함

 

 

 

 

A. 우리 팀 답

const twoSum = (nums, target) => {
    const arr = []
    for( i = 0 ; i < nums.length ; i++ ){
      for( j = 0 ; j < nums.length ; j++ ){
        let sum = nums[i] + nums[j]
        if( sum === target && nums[i] !== nums[j] ){
          arr.push(i, j)
        }
      }
    }
  return Array.from(new Set(arr))
}

// 예
let nums = [4, 9, 11, 14, 7 ,6] 
console.log(twoSum(nums, 13)) // [ 0, 1, 4, 5 ]

 

  • 두 가지 수의 합을 위한 모든 경우의 수를 위해
    • for문을 사용해 배열의 각 요소를 돌며 i 값을 증가시킨다.
    • for문을 사용해 배열의 각 요소를 돌며 j 값을 증가시킨다.
  • i와 j를 각각 인덱스 값에 적용시켜 배열 속 2가지 수로 만들 수 있는 모든 합을 구함다.
  • 만약 "그 합이 taget 값과 같음 && i와 j 가 다른 값임" 조건을 만족하면
  • arr배열에 i, j 값을 추가한다. 
    •  예 [ 0, 1, 1, 0, 4, 5, 5, 4 ]
  • 이 배열에는 4 + 9, 9 + 4, 7 + 6, 6 + 7에 해당하는 index 값이 모두 담겨 중복된 값을 가지게 된다.
  •  new Set()내장객체를 사용해 배열 내 중복 된 값을 제거 한다.
    • new Set() (MDN 명세) : 자료형에 관계없이 유일한 값만 저장
  • Array.form()메서드를 사용해 새로운 배열로 만들어 반환
    • Array.form()메서드 (MDN 명세) : 유사 배열이나 반복 가능한 객체를 복사해 새로운 Array를 생성

 

 

B. 다른 팀 답 참고해 다시 풀어보기

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

// 예
let nums = [4, 9, 11, 14, 7 ,6] 
console.log(twoSum(nums, 13))   //  [0, 1, 4, 5, 5, 4 ]
  • 두 번 째 인덱스 값인 j의 for문을 돌릴 때 1부터 세팅하는 방법.
    이렇게 되면 처음부터 중복된 값을 피하며 계산할 수 있다. 😨
  • But 이 꿀팁을 활용해 테스트를 돌려보았는데, 원하는 값이 안나왔다. 
  • 마지막 턴에서 i가 5가 되었을 때, j가 1, 2, 3, 4를 돌며 num[i] = 6, num[j] = 7인 상황에 결국 걸려버린 것.

 

const twoSum= (nums, target) => {
    const arr = []
    for( i = 0 ; i < nums.length - 1 ; i++ ){
      for( j = 1; j < nums.length; j++ ){
           if( nums[i] + nums[j] === target ){
             arr.push(i, j)
           }
        }
     }
    return arr
}
// 예
let nums = [4, 9, 11, 14, 7 ,6] 
console.log(twoSum(nums, 13))   //  [0, 1, 4, 5]

 

  • 마지막 턴을 없애기 위해 첫 for 문을 마지막 인덱스 한 칸 앞인 num[4]=7에서 마칠 수 있도록, 조건에 -1을 추가했다.

 

 

 

 

 

문제 풀이 후 세 팀과 방법을 공유했는데, 세 팀 다 다르게 작성했다는 사실에 놀람.

 

 

 

 

 

반응형

댓글