[자바스크립트 알고리즘] 숫자배열과 '특정 수'를 인자로 넘기면, 더해서 '특정 수'가 나오는 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개의 댓글

관련 채용 정보