[CodeKata] Day1. 두 수의 합이 target값일 때, 두 수의 index number를 구하기

Joah·2022년 6월 7일
0

자료구조

목록 보기
1/11

문제

첫 번째 접근

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


let number =  [4, 9, 11, 14, 44, 22]; 
console.log(twoSum(number, 66))
  • 결과값은 undefined
  • 이때 아! 이중 for문을 작성해야 하는구나!

두 번째 접근

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

let number =  [4, 9, 11, 14, 44, 22]; 
console.log(twoSum(number, 15))
  • test도 통과하고 콘솔에도 정상적으로 출력되었다.
  • 더 간결하고 짧은 코드는 없을까?

마지막 접근

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];
      }
    }
  }
};

let number =  [4, 9, 11, 14, 44, 22]; 
console.log(twoSum(number, 66))
  • 굳이 arr라는 빈 배열을 만들어서 push할 필요없이 return 자체를 배열로 하면 훨씬 간결하고 메모리 차지도 하지 않을 것 같다.
  • else문을 작성하지 않아도 된다는 것을 알게 되었다!

생각도 못했던 것을 동기분이 알려주셨다!

  • 이중 for문에서 j의 초깃값을 1로 설정했었는데 i + 1로 수정한 이유
    • i가 0부터 시작하기 때문에 인덱스 넘버 0인 4부터 다음 숫자들과 비교한다.
      💥만약 for문을 돌고돌아 i가 2가 되고 11부터 다음 숫자들과 비교한다고 할때, j를 1로 지정하면 11과 9를 더하게 된다. 하지만 i가 1일때 9부터 다음 숫자들과 비교할때, 이미 9와 11을 더하는 식을 반복문은 진행했었다.💥
    • j는 i의 바로 다음 숫자인 i + 1이 j를 무조건 1로 설정하는 명령보다 효율적이다.
profile
Front-end Developer

0개의 댓글