[EHL]알고리즘 코드카타 Day 1

devMarco·2022년 4월 11일
0

Error Handling Log

목록 보기
2/3

문제

twoSum함수에 숫자배열과 '특정 수'를 인자로 넘기면, 더해서 '특정 수'가 나오는 index를 배열에 담아 return해 주세요.

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

예를 들어,
nums은 [4, 9, 11, 14] target은 13

nums[0] + nums[1] = 4 + 9 = 13 이죠?

그러면 [0, 1]이 return 되어야 합니다.

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

처음 문제를 보고 수기코드로 모델링을 시작하였다. 역시나 지금의 실력으로는 문제를 보고 바로 머리속에 어떤방식으로 풀어야 할지 생각이 나지 않았다.
천천히 다시 읽어보니 어떤로직으로 풀어가야 할 지 생각이 들기 시작했다. 배열로 들어오는 인자들을 돌아가면서 겹치지 않도록 한번씩 더해준뒤 인덱스로 다시 반환을 하는 것이었다. 여기서 반환의 기준은 target의 전달인자와 두개의 인덱스의 수를 더했을 때 값이 같을 때 이 target의 값과 더해진 nums의 인덱스의 합이 같을 때 두개의 인덱스를 반환 하면 되는 것이다.
처음 로직은 두 수를 더해서 빈 배열에 반환 하려 했으나 이미 더해지는 전달인자 자체가 배열이기 때문에 굳이 빈 배열을 만들어서 반환 할 필요가 없었다.
두번째 고민으로는 [0],[1],[2],[3] 각각의 자리마다 배열을 할 생각을 했으나 반복문 자체가 더하기 앞에 들어오는 인덱스를 계속 바꿔주기 때문에 더하기 앞자리의 반복문을 중첩으로 돌릴 필요가 없었다.그래서 더하기 뒤에 들어오는 인덱스도 한번만 반복을 하면 되는 것이었다.
그래서 첫번째 고민에서 완성하게 된 함수는

const twoSum = (nums, target) => {
  // 아래 코드를 작성해주세요.
    
  for(let i=0; i<nums.length; i++){
    for(let j=1; j<nums.length; i++){
      if (nums[i] + nums[j] === target){
        return [i, j]
      }
    }
  }
}

console.log(twoSum([4, 9, 11, 14], 13))

두번째 다시 만든 함수는

const twoSum = (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]
       }
     }
  }
}

console.log(twoSum([1, 9, 9, 14], 18))

둘의 차이점은 바로 두번째 반복문의 기준점이다!

for(let j=1; j<nums.length; i++)

for(let j=i+1; j<nums.length; j++)

첫번째 로직도 테스트에서는 통과가 가능하다.문제에서 주어진 인풋을 넣어보면 같은 값이 나온다.그러나 반복문에 기준점을 다시 생각해 보면 두번째 로직에 있는 수를 넣으면 다른 값을 받게 된다.
같은 값을 넣었을 때 첫번째 로직에서는 [1, 1]
두번째 로직에서는 [1,2] 와 같은 다른 값을 반환하게 된다.이유는 첫번째 로직에서는 두번째 반복문이 시작될때 자기 자신과도 비교를 하게 되기 때문에 같은 자리의 인덱스와도 더하기 연산이 실행이 된다. 이런 점을 잘 이해하고 조건이 더 까다로운 상황에도 대비를 해야하겠다.

0개의 댓글