[Code Kata] Week1 - Day1

JU CHEOLJIN·2021년 8월 18일
0

Algorithm

목록 보기
13/16
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개 밖에 없다고 가정하겠습니다.

풀이

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

profile
사회에 도움이 되는 것은 꿈, 바로 옆의 도움이 되는 것은 평생 목표인 개발자.

0개의 댓글