문제!
twosum함수에 숫자 배열과 '특정 수'를 인자로 넘기면, 더해서 '특정 수'가 나오는 index를 배열에 담아 return해주세요.
ex) nums : 숫자 배열 / target : 두 수를 더해 나올 수 있는 합계 / return : 두 수의 index를 가진 숫자 배열
nums의 배열 안에 있는 숫자 2개를 합쳐서 target이 되는 nums의 인덱스를 return 해줘!
- 처음엔 nums의 배열에 있는 숫자들이 하나도 빠짐 없이 서로를 더해볼 수 있는 경우의 수를 찾으려고 했다.
- 경우의 수 찾기
nums=[1,2,3,4,5,6,7] 일 때,
1과 더할 수 있는 숫자 조합의 경우의 수 => 2,3,4,5,6,7
2일 때 => 3,4,5,6,7 *단, 1하고는 더하지 않아도 된다. 앞에서 했으니까!
3일 때 => 4,5,6,7
4일 때 => 5,6,7
5일 때 => 6,7
6일 때 => 7
뭔가 보인다..... 보여...... for문이 보인다......
숫자들을 여러번 반복해서 더해주는 for문에 접근까지 완료했다.
하지만, 문제가 생겼다. 1,2,3,4,5,6을 하나씩 꺼내서 더해볼 수는 있는데.. 1일 때 2,3,4,5,6,7은 또 어떻게 더하느냐 말이다!
아 또 보인다..... 보여..... for문 보인다...
1일 때, 2일 때, 3일 때, 4일 때, 5일 때, 6일 때가 for문으로 반복되었다면, 1일 때 2,3,4,5,6,7을 또 반복문을 써주면 되지 않겠는가!!
즉, 중첩 for문이 필요한 것이다!
위의 작성한 코드를 차근차근 해석해보자. 코드를 잘 만드는 것만큼 잘 만들어진 코드를 잘 해석하는 것도 중요하다고 생각한다!
바깥에 있는 for문을 통해 i=0부터 nums.length전까지 반복한다.
반복하면서 return되는 값을 순서대로 해석해보자.
i=0 => nums[0] = 1 인데, 내부의 중첩 for문에 의해서 j=i+1 부터 다시 돌게 된다.
즉, i=0일 때(가장 바깥 for문에 의해) j=0+1부터 nums.length 까지 반복한다.
i=0 / j=0+1, j=2, j=3, j=4,j=5, j=6, j=7
i=1 / j=1+1, j=3, j=4,j=5, j=6, j=7
i=2 / j=2+1, j=4,j=5, j=6, j=7
이렇게 i < nums.length까지 반복하는 것이다.
그랬을 때, nums[i]+ nums[j] === target과 같다면 그 때의 인덱스를 반환하고 함수를 종료해줘라! 라는 것이다.
끝!