[Code Kata] Week1 - Day1

문제

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

풀이

1번 풀이(나의 풀이)

const twoSum = (nums, target) => {
  // 아래 코드를 작성해주세요.
  let result = [];
  nums.forEach((num, i) => {
    let targetIndex = nums.indexOf(target - num);
    targetIndex !== -1 && result.push(i);
  });
  return result;
}

이번 문제의 경우에 nums 라는 숫자가 담긴 배열을 받고 이를 통해서 두 수의 합이 target과 동일한 수들의 인덱스를 구해야한다. 문제의 조건을 나눠보면 아래와 같다.

  1. 주어진 숫자를 순회하면서 조건을 만족하는지 검사한다.
  2. 두 수의 합이 target 이 나오기 위해서 num을 순회 중일 때 target-num이 배열 안에 존재하면 된다.
  3. 조건을 만족하는 경우에 해당 num 의 인덱스를 result 배열에 넣어준다.

따라서 위의 코드를 보면 반환해 줄 result 라는 비어있는 배열을 선언해준 뒤에 numi 를 인자로 받는 forEach()를 통해서 target - num 이 존재하는 num 의 인덱스인 iresult 배열에 넣어주도록 했다. 위의 경우에 만약 2가지 이상의 경우가 존재하게 되면 모든 수의 인덱스를 받아올 수 있으므로 문제의 조건도 충분히 만족한다.

2번 풀이(짝의 풀이)

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

코드 카타는 2인 협동으로 진행이 된다. 한 명은 드라이버(직접 구현)이고 한 명은 네비게이터(방향 제시)를 진행하는데 이번에는 내가 드라이버를 맡았다보니 세준님의 코드를 볼 수 있었다.

세준님의 경우에는 for문 중첩을 이용해서 두 수의 합이 target 과 동일한 경우에 두 인덱스를 넣어주도록 했다. 두 사람이 한 개의 문제에 접근을 하다보니 생각에 따라서 다양한 코드가 나올 수 있고 이를 통해서 생각을 넓힐 수 있는 기회가 될 것 같다. 또한, 나의 경우에 문제를 작게 쪼개면서 정리되지 않은 코드들을 붙여 해결하는 안 좋은 습관이 있기 때문에 이를 통해서 코드의 가독성이나 문제에 대한 접근 방법에 대해서 고민해볼 기회가 되었으면 한다.

좋은 웹페이지 즐겨찾기