[자바스크립트 알고리즘] 숫자배열과 '특정 수'를 인자로 넘기면, 더해서 '특정 수'가 나오는 index 배열 리턴하기

이은진·2020년 11월 30일
0

알고리즘 공부

목록 보기
1/7

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개 밖에 없다고 가정하겠습니다.

2. 내 풀이

문제에서 원하는 결과의 형태가 배열이기 때문에 먼저 let result = []라고 빈 배열을 선언해줬다. 그리고 이중 for문을 돌려서 두 원소를 뽑는 경우의 수를 모두 고려하도록 했다. 이 문제에서 주어진 배열은 짧지만 실제 코딩 테스트에 나오는 배열은 원소가 만 개, 십만 개 이상 될 수 있으므로, 최대한 중복을 피하기 위해 i=0부터, j=i+1부터 뽑도록 했다.

그리고 인덱스 i, j에 해당하는 값을 더한 결과가 twoSum의 두 번째 인자 값에 해당하는 경우, 앞서 선언해 준 빈 배열에 각각 push해서 리턴해 주었다.

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

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

// [0, 1]

3. 페어코딩 후 풀이

첫 코드카타 짝꿍은 해인님과 함께했다. 먼저 10분 동안 문제를 읽고 골똘히 생각해본 후 대충 감이 잡히면 함께 이야기해보도록 했다.

내 코드에서 달라진 부분은, 제일 처음에 결과값을 담을 배열을 굳이 선언하지 않았다는 점이다. 자바스크립트에서 결과값들을 바로 배열에 넣어 리턴해 줘도 되기 때문이다. Array.push() 메서드를 두 번이나 연달아 쓰는 게 어쩐지 찝찝하긴 했다. 또한 temp로 배열의 합을 넣어주는 코드도 생략했다. 훨씬 깔끔한 결과로 나왔다.

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

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

//[0, 1]

기억에 남는 점은 해인님이 for문에서 curly braces를 안 붙이고 그냥 쓰셨는데도 온전히 결과가 나왔다는 점. 새로운 ES7 문법이라도 적용하신 줄 알고 너무 신세계라서 놀랐는데 해인님도 모르고 빼먹으신 거였다. 그래서 JS for문 문법을 검색해 봐도 딱히 생략을 해도 된다는 내용이 나오지 않아 여전히 의문이다. ㅋㅋ

profile
빵굽는 프론트엔드 개발자

0개의 댓글