CodeKata 1 - W1D1

Yonghyun·2021년 9월 14일
0

CodeKata

목록 보기
1/5
post-thumbnail

문제

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개 밖에 없다고 가정하겠습니다.

내 첫번째 풀이

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

이렇게 생각도 안하고 무작정 코드를 짜니 test가 fail이 뜨지....😭
진짜 말도 안되게 변수 i에 대해서는 for문이 다 돌수도 없는 위치에서 arr를 return해줘버렸다. 답이 i가 0인 케이스에만 success가 뜰 수 있는.. 차라리 이중for문이 다 끝나는 위치에서 return을 해줬으면 됐을텐데 이도저도 아니게되버렸다.

두번째 풀이

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

일단 test case가 모두 success가 되긴 했다. 문제에서 target으로 보내는 합계의 조합은 배열 전체 중에 2개 밖에 없다고 가정하겠습니다. 라고 했기 때문에 가장 안쪽 if문에서 조건을 만족하는 경우 바로 return을 하게 해줘도 success가 뜨게 된다. 만약 조건을 만족하는 조합이 여러개였다면 첫번째 풀이 후 생각했던 것처럼 이중 for문이 모두 끝난 후에 return을 해줘야 success가 떴을 것이다.
추가로 이번 테스트 케이스에서는 배열의 같은 인덱스의 값을 두번 더할 수 없다는 조건을 주지 않았기 때문에 두번째 for문의 변수 j 시작값을 i와 같이 0으로 줘도 success가 떴지만 만약 같은 값을 두번 더할 수 없다는 조건이 붙었다면 필수적으로 조정해 주어야 했을 것이다.

세번째 풀이

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

두번째 풀이의 연장으로 만족하는 배열의 조합이 하나이기 때문에 따로 빈배열을 만들어 push해주지 않고 조건을 만족하는 i와 j의 값을 바로 배열에 담아 return해주었다. 덕분에 쓸데없는 코드의 길이를 줄일 수 있었다. 이런 코드를 작성하기 위해서 첫번째 풀이를 시작할 때처럼 무지성으로 빈배열부터 만들고 거기에 담을 생각을 할게 아니라 문제에서 원하는 수준의 답이 무엇인지, 그 답을 구하기 위해 필요한 요소가 무엇인지 먼저 생각한 후에 코드를 짜는 습관을 길러야겠다.

profile
Life is all about timing.

0개의 댓글