twoSum함수에 숫자배열과 '특정 수'를 인자로 넘기면, 더해서 '특정 수'가 나오는 index를 배열에 담아 return해 주세요.
fuction twoSum (arr, target) {return [ num , num ]}
조건
arr : 숫자 배열
target : 두 수를 더해서 나올 수 있는 합계
return : 두 수의 index를 가진 숫자 배열예시
arr은 [4, 9, 11, 14] target은 13
arr[0] + arr[1] = 4 + 9 = 13 이죠?
그러면 [0, 1]이 return 되어야 합니다.가정
target으로 보내는 합계의 조합은 배열 전체 중에 2개 밖에 없다고 가정하겠습니다.
for
문, indexOf
사용const twoSum = (arr, target) => { for (i = 0; i < arr.length; i++) { let answer = []; if (arr.indexOf(target - arr[i]) > -1) { answer.push(i) answer.push(arr.indexOf(target - arr[i])) return answer; } } }
- 이 방식으로 풀 때 처음에 return의 위치때문에 빈 배열이 반환되어서, 헤맸었다.
- 처음에 아래와 같이 코드를 작성하였는데, if 뒤에 else조건을 적지 않아서, arr[0] 돌 때, 조건을 달성하지 않으면 바로 [ ] 빈 배열이 return 되었다.
// 처음에 잘 못 작성한 코드 const twoSum = (arr, target) => { for (i = 0; i < arr.length; i++) { let answer = []; if (arr.indexOf(target - arr[i]) > -1) { answer.push(i) answer.push(arr.indexOf(target - arr[i])) } return answer; // return의 위치가 중요했던 것이다...... } }
- 구글링을 통해 클린코드를 위한 early return에 대해서 알게 되었음
- 굳이 else 일 때를 작성하지 않고, if 실행문 안에 return 을 넣어 버리면, 값이 만족할 때까지 for문을 돌다가, 조건을 만족할 때에 return이 된다.
const twoSum = (arr, target) => { for (i = 0; i < arr.length; i++) { if (arr.indexOf(target - arr[i]) > -1) { return [i, arr.indexOf(target - arr[i])] } } }
- push를 사용하지 않고, 해당되는 값을 바로 return하는 방식
- 이것도 결국, return이 if 실행문 안에 있었기 때문에 통과한 듯