32_알고리즘

charlie_·2021년 7월 19일
0

TIL

목록 보기
31/42
post-thumbnail

하루에 한 문제씩 6주 간 진행하는 위코드의 code kata가 시작되었다.

Q. 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단계, 배열에서 두 개를 골라 더하는 코드를 짠다.
    2단계, 더한 값과 target값을 비교하는 코드를 짠다.
    3단계, 일치하는 경우, 배열에서 해당되는 index값을 return한다.

1) 각각의 값을 더하도록 for문 중첩을 사용하고
2) 더한 결과값은 객체의 value값으로, 인덱스는 key값으로 return하려고 했다.

예를 들어, sum = {0,1 : 13, 0,2 : 15, 0,3 : 17, ...} 이런 식으로 말이다.
그래서 나는 아래와 같은 방식으로 코드를 짰다.

function twoSum(nums, target) {
  let sum = {};
  for(let i = 0; i < nums.length; i++) {
    for(let j = i + 1; j < nums.length; j++) {
      sum[[i, j]] = nums[i] + nums[j];
      if(sum[[i, j]] === target) {
        return [i, j]
      }
    };
  };

문제를 풀고 팀원인 재현님의 코드와 비교를 해봤다.

function twoSum(nums, target) {
  for(let i = 0 ; i < nums.length; i++) {
    for(let j = i + 1 ; j < nums.length ; j++) {
      if(nums[i] + nums[j] === target) {
        return [i, j];
      }
    }
  };
};

재현님의 코드가 더 간결하고 깔끔하다.

  • 결론

문제를 세부적으로 쪼개되 그대로 쫓아가지만 말고, 단계를 합쳐서 코드의 효율성을 높이는 과정이 필요하다.

** 양수 0과 음수 0이 있었다. 이거 뭐지?

profile
매일 하루에 딱 한 걸음만

0개의 댓글