이중 for 문에 대한 착각 (의 답을 또 착각)

김윤철·2022년 7월 19일
1

이중 for문에 대한 착각에 대한 답을 또 착각하여서 밑에 수정하여 다시 공부하였습니다


<박스 안의 내용은 헛짚은 내용이니 보지마세요>

처음에 이중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문은 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문은 for문안에 값을 할당하였기에 방금과 같이 for문 안에 값의 할당이 없는 경우와 아예 다른 케이스였다.

예시를 보자

예시와 같이, for문안에 test를 선언하고 push로 값을 준다면 저 위치의 console.log(test)는 무엇이 뜰까?

정답은 이전의 예시와 같은 '(water~vitamin~undefined까지) 6-5-4-3-2-1-0 (개)'이다.

그렇다면

혹은

와 같이 선언과 할당의 위치를 바꾸면 어떻게 될까?

전혀 내가 원하는 답이 나오질 않는다.

이처럼 이중for문은 형식도 중요하지만, 코드 내의 변수 선언 및 값의 할당 위치가 매우 매우 매우 중요하다는 사실을 깨달았다. 아직은 console을 찍지 않고는 어떤 값이 나올지 정확히 예측은 못하지만 대충 감이 잡히는 것 같다.

코드의 디테일을 손보고(내가 정확히 원하는 값을 구현하려면 j=i이고 비교할때 [j+1]을 해야 중복없이 비교가 가능하더라) arr을 복잡하게 바꿔보고 중복값을 찾아내는지 구현해봤다.
terminal에 잘 찍히는걸 보고 매우 매우 뿌듯함!!


사실 new Set, [...array]를 이용하여 쉽게 중복을 걸러낼 수는 있지만 괜히 이중 for문에 꽂혀서 한 번 도전해본건데...
다행히도 언제나 그랬듯이... 시간을 녹여서 답을 찾아냈다.
아직은 쉬운 방법보다는 원초적인 방법으로 원리를 이해하는게 더 도움이 될 것 같아 힘들지만 이런 식으로 접근하는게 좋을 것 같다.

profile
코린이(코인아님)

0개의 댓글