twoSum함수에 숫자배열과 '특정 수'를 인자로 넘기면, 더해서 '특정 수'가 나오는 index를 배열에 담아 return해 주세요.
nums은 [4, 9, 11, 14] target은 13
nums[0] + nums[1] = 4 + 9 = 13 이죠?
그러면 [0, 1]이 return 되어야 합니다.
처음 이 문제를 접한 나는 for문을 쓰면 되겠는데 ? 라는 생각을 했고 그걸 코드로 작성하려니 멍.. 했습니다.
그렇게 여러 고민 끝에 풀이 법을 알아냇고 풀이법은 중첩for문 이었습니다.
중첩 for문 이란 ?
for(var i=0; i<100; i++){
for(var j=0; j<100; j++){
}
}
위 처럼 for문 안에 for문이 있는 형태입니다.
위와 같이 for문이 한번만 실행 되는 경우에는 결과값이 오른쪽과 같이 출력됩니다 !
위 처럼 for문안에 for문이 들어가있는경우에 중첩for문 이라고 합니다.
중첩 for문 같은 경우 오른쪽 결과값 보이시나요 ? 상위 for문이 i = 0 으로 선언했으므로 0부터 시작하게되고
그 밑 for문에서 j = 1 로 선언함으로 i = 0으로 고정 j = 1 부터 10까지 출력 후 j <=10 이므로 순회가 끝나 다시 i 순서로 넘어가게 된다.
그래서 결과값이 i 는 0 으로 고정 j 는 1부터 10까지 출력 후 다시 i = 1 부터 j = 1 에서 10까지 이렇게 i = 10 이 될때까지 순회하게 된다.
다시 본론으로 돌아와서 문제를 보겠습니다.
twoSum함수에 숫자배열과 '특정 수'를 인자로 넘기면, 더해서 '특정 수'가 나오는 index를 배열에 담아 return해 주세요.
nums은 [4, 9, 11, 14] target은 13
nums[0] + nums[1] = 4 + 9 = 13 이죠?
그러면 [0, 1]이 return 되어야 합니다.
자 그럼 우리는 다시 생각 해볼 필요가 있습니다. 위와 같이 nums가 [4, 9, 11, 14] target은 13 이라고 가정했을 때
?번째 인덱스 + ?번째 인덱스 === target 일때 return[?,?] 이렇게 출력이 되어야 한다.
그럼 이중 for문을 통해 작성해 보자
const 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]
}
}
}
}
이렇게 작성해봤다.
위에서 그림 예시 들어 설명한 것 처럼
앞에 숫자 하나는 고정을 시켜놓고 뒤에숫자만 바꿔가면서 비교를 해야겠다는 생각이 들어서 위와 같이 작성해보았다.
j에 +1을 해준 이유는 target로 보내는 합계의 조합은 배열전체에 두개 밖에 없다고 했기 때문에
0,0 / 1,1 / 2,2 이렇게 나올수 없기 때문에 j 에 1을 더해줬다.