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() 공식문서

0개의 댓글

관련 채용 정보