Code Kata #1

Somi·2021년 6월 21일
0

CODE KATA

목록 보기
1/12
post-thumbnail

코드카타 #1
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개 밖에 없다고 가정하겠습니다.

💁 문제 분석

배열에서 두 수를 빼내 덧셈을 한 값이 타겟값과 같으면 두수의 배열 인덱스 값을 리턴해줘야 하므로, 덧셈을 할 두 수를 찾기 위해서 for문을 이용하고, 조건에 맞는 수를 찾아야 하니, for문 안에 if문을 넣어줘야겠다!

🙈 나의 코드

✔️ 첫번째 시도

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

module.exports = { twoSum };

처음에는 i와 i+1로 변수를 설정했지만, nums의 배열에 두 수가 붙어있지 않으면 리턴이 안되어서 실패했다!

✔️ 두번째 시도

그렇다면 아예 변수를 다르게 설정하여 비교하면 어떨까? 라는 마음에서 변수 i와 j를 선언하고 반복문을 돌려보았다.

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

module.exports = { twoSum };

결과는 성공, let j에서 i+1이 아닌 1로 줘도 무방한 것 같다.

👍 다른 답변

const twoSum = (nums, target) => {
  // 아래 코드를 작성해주세요.
  let arr = [];
  
  const subArr = nums.map(num => target - num);
  const intersection = nums.filter(num => subArr.includes(num))
  intersection.forEach(num => arr.push(nums.indexOf(num)))
  return arr;
};

빛열음님의 코드...! 정말 빛과 같아서 충격;; for문이 비효율적이어서 어떤 방법이 있을지 고민했는데 이런 방법이 있다니 매우 충격이당.
아직 map메서드와 친하지 않은데 이번 기회에 공부를 다시 해야겠다고 생각했다.

Array.map() 기술블로그
Array.map() 공식문서
Array.filter() 공식문서

profile
인생은 즐거워٩( ᐛ )و

0개의 댓글