<박스 안의 내용은 헛짚은 내용이니 보지마세요>
처음에 이중for문에 대해서 이해가 잘 안되었으나, 구구단(참조 : https://ho-ding.tistory.com/30)에 비유한 글을 보고 확 와닿았으며 개인적으로 연습해서 이해를 했습니다.
![](https://velog.velcdn.com/images/aaronkim/post/c2048dc3-599b-423e-9cc9-365ea95ec5a4/image.png)
결국 조합의 느낌인데 중복되지 않는 경우의 수를 찾는 방법과 유사하다고 생각했습니다.
그런데 저는 이중 for문을 쓰는게 for문 괄호 안에 for문을 쓰면 된다고 생각했는데... 그것이 아니었습니다.
### 내가 이해한 2중 for문
for (let i=0; i<numbers.length; i++){
그냥 이런식으로 for문의 괄호 안에 for문이 있으면 되는줄 알았다.
for (let j=0; j<numbers.length; j++){
나는 바보 멍청이
}
입니다
};
### 알고 보니 2중 포문은 연속해서 써야했었다.
다른 문제를 풀다가 아래는 왜 2중 for문이 안되는 것일까? 의문을 갖고 연습을 했습니다.
그 결과, for문과 for문 사이의 let sum = []; 을 for문 위로 보내면 이중 for문이 작동하는 것을 확인했습니다.
그러니까 여태 괄호로 2중 for문을 쓰는 줄 알았는데 그냥 연속해서 쓰면 됐었던 것...!!
후.. 문제 풀다가 2중 for문 쓰기 싫은데 강제로 써야하나 라는 생각을 했었는데
그 문제마저 속 시원하게 해결 !!
-----
#### 2중 for문이 적용되지 않고 원하는 대로 잘 나오는 모습이다.
![](https://velog.velcdn.com/images/aaronkim/post/1968f0e7-0744-40fc-b317-86a46413dbf8/image.png)
#### let = sum[];의 위치를 바꾸자 똑같은 답이 중첩으로 나오는 모습
![](https://velog.velcdn.com/images/aaronkim/post/46b4edb9-52ed-4062-b3a5-093880531a66/image.png)
-----
#### <코드>
function solution(arr1, arr2) {
let answer = [];
for (let i=0; i<arr1.length; i++){
let sum = []; <---- 이놈이 이중 for문을 제어해주고 있었음
for (let j=0; j<(arr1[0]).length; j++){
sum.push(arr1[i][j] + arr2[i][j]);
}
answer.push(sum);
}
return answer;
}
처음 내가 짚었던 이중 for문은 for문의 괄호안에 또 for문을 써서 적용시키는 것이 맞았다.
그럼 어느 부분을 잘못 이해했는가? 바로 변수 선언의 위치, 값의 할당 등이다.
호이스팅 , TDZ 등을 배워서 조금 감이 오길래 vs code에서 여러번 찍어봤다.
이 식대로 하면 내가 원하는 대로 i와 j를 중복없이 조합할 수 있는 이중 for문이 나온다.
경우의 수는 조합(7C2 = 21개)과 같다
즉 여기서
console.log(arr[i])는 (coke~vitamin순으로) 7-6-5-4-3-2-1 (개)
console.log(arr[j])는 (water~vitamin~undefined까지) 6-5-4-3-2-1-0 (개)
가 arr[i] , arr[j] 순으로 찍히며 둘을 비교 가능하게 만들 수 있는 것이다.
그렇다면 이 작업을 하면서 무엇을 배웠는가?
코드를 먼저 보자.
처음과 다르게 console.log(arr[i])가 이 위치에 있다면 ( 첫 for문 내이지만 두 번째 for문의 밖) 어떻게 나올까?
첫 for문만 적용받아 coke~vitamin순으로 arr.length까지 돌고 끝난다.
즉, 이중 for문을 적용하려면 첫 for문과 두 번째 for문 안에 있어야 한다는 것!!
예시를 보자
예시와 같이, for문안에 test를 선언하고 push로 값을 준다면 저 위치의 console.log(test)는 무엇이 뜰까?
정답은 이전의 예시와 같은 '(water~vitamin~undefined까지) 6-5-4-3-2-1-0 (개)'이다.
그렇다면
혹은
와 같이 선언과 할당의 위치를 바꾸면 어떻게 될까?
전혀 내가 원하는 답이 나오질 않는다.
코드의 디테일을 손보고(내가 정확히 원하는 값을 구현하려면 j=i이고 비교할때 [j+1]을 해야 중복없이 비교가 가능하더라) arr을 복잡하게 바꿔보고 중복값을 찾아내는지 구현해봤다.
terminal에 잘 찍히는걸 보고 매우 매우 뿌듯함!!
사실 new Set, [...array]를 이용하여 쉽게 중복을 걸러낼 수는 있지만 괜히 이중 for문에 꽂혀서 한 번 도전해본건데...
다행히도 언제나 그랬듯이... 시간을 녹여서 답을 찾아냈다.
아직은 쉬운 방법보다는 원초적인 방법으로 원리를 이해하는게 더 도움이 될 것 같아 힘들지만 이런 식으로 접근하는게 좋을 것 같다.