코드카타 #1

김태현·2020년 11월 2일
0

코드카타

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

문제해석
nums 배열의 요소 중에서 더해서 target이 나오는 nums의 인덱스 값들을
반환하라.
한쌍 밖에 존재하지 않음!

먼저 내가 해본것

const twoSum = (nums, target) => {
  index = [];
  
  // 
  for (let i = 0; i < nums.length; i++) {
    if(nums[i] + nums[i+1] === target) {
      index.push(i,i+1);
    }
  }
  return index;
  let result = [];
  for(let i = 0; i < nums.length-1; i++) {
    for(let j = i; j < nums.length; j++) {
      if(nums[i] + num[j] === target) {
        result.push(i, j);
        return result;
      }
    }
  }
}

twoSum([4,13,11,9], 13); 

이러면 값이 나오긴하는데 그 값들이 반드시 인접해 있어야만 성립하기 때문에 twoSum([4,11,13,9], 13) 같이 4와 9가 서로 떨어져있으면 빈배열이 반환되기 때문에 실패

옆자리 현지님의 풀이를 보자.
현지님은 2가지 방법으로 푸셨다.
먼저 1번!

  // 현지님 풀이1
  let result = [];
  for(let i = 0; i < nums.length-1; i++) {
    for(let j = i; j < nums.length; j++) {
      if(nums[i] + num[j] === target) {
        result.push(i, j);
        return result;
      }
    }
  }

구구단 하듯이 배열의 요소들을 이중반복문으로 돌면서 조건에 맞는 값들을 빈배열에 push 하심
이중반복문은 근데 좀 안좋은 방법이라 좀 더 나은 방법이 없을까 고민하던 차에 2번탄생

  // 현지님 풀이2
  let myobj = {};
  for(let i = 0; i < nums.length; i++) {
  const diff = target - nums[i];
    myobj[diff] = i;
  }
  
  for(let i = 0; i < nums.length; i++) {
    if(myobj[nums[i]]) {
      result.push(i, myobj[nums[i]]);
      return result;
    }
  }

먼저 빈 객체를 만듬.
그리고 nums에 반복문을 돈다.
target인 13과 nums의 각 요소들의 차를 diff에 저장.
diff를 키로 인덱스를 벨류로 해서 빈 객체를 채운다.
그러면 객체가 새로 탄생하게 되는데 다음과 같다.

nums = [4, 13, 9, 11] 이라고 가정했을시, 값이 채워진 객체는
myobj = {
9: 0,
0: 1,
4: 2,
2: 3
}

이렇게 객체를 만들었으면 또 다시 nums로 반복문을 돈다.
if(myobj[nums[i]]) 이것은 nums 배열의 인덱스(i)로 찾은 요소의 값을 다시 myobj의 키로 사용해서 벨류값이 참인지 거짓인지 판별하는 것이다. (값이 없거나 0이면 false, 어떠한 값이라도 있으면 true)
그래서 반복문을 돌면 i = 0, numbs[0] = 4, myobj[4] = 2 이므로 값이 true가 되고, 그 numbs 배열의 인덱스와 객체에서 찾은 벨류의 값을 최종적으로 선택하여 빈 배열에 푸쉬해준다.

느낀점
배열과 객체를 자유자재로 넘나들고 반복문에 조금 더 친숙해져야겠다.
배열의 요소가 객체의 키가 되어서 벨류값을 찾고 그런 것들에 좀 더 익숙해져야할듯.

profile
프론트엔드 개발자

0개의 댓글