내일배움캠프 32일차

2023년 04월 28일 by barryjung

    내일배움캠프 32일차 목차

[오늘 한일]

  • 알고리즘 문제풀이
  • 장고심화 개인과제 마무리
  • 장고 심화강의 수강
  • OOP 특강 수강

 

[오늘 배운점]

알고리즘 문제를 풀으며 배운점을 적겠다.

특강에서 배운점은 주말 배운점에 적겠다.

 

<리스트 컴프리헨션안에서 리스트 컴프리헨션>

오늘 '행렬의 덧셈'  문제에서 만난 상황이였다.

리스트 컴프리헨션을 선언하며 그안에서 리스트 컴프리헨션을 할수 있을까?

즉, 이중 리스트를 만들수 있을지 궁금했다.

 

주어지는 입력은 [[1, 2], [2, 3]], [[3, 4], [5, 6]] 이렇게 두개의 이중 리스트이고,

기대되는 출력은 [[4, 6], [7, 9]] 각 위치끼리 더해진 이중 리스트이다.

 

입력 리스트의 행과 열의 길이는 달라질수 있는 요소이다.

그렇기 때문에 행, 열 길이를 참고하는 반복으로 리스트를 작성하게 해야한다.

그래서 리스트 컴프리헨션이 적합하다고 생각되었지만,

위에 적은대로 컴프리헨션 안에서 컴프리헨션이 되는지 몰랐기에,

우선 반복문으로 원하는 동작대로 작성했다.

 

def solution(arr1, arr2):
    answer = []
    for x in range(len(arr1)):
        templist = []
        for y in range(len(arr1[0])):
            templist.append(arr1[x][y]+arr2[x][y])
        answer.append(templist)
    return answer		#[[4, 6], [7, 9]]

이렇게 말그대로, 행 길이와 열 길이를 참고하며,

행열 안에서 두 리스트의 요소끼리 더한 값들을 리스트로 만들어,

answer리스트에 작성되도록 만들었고, 결과가 잘 나왔다.

 

 

잘 되는걸 봤으니 이제 리스트 컴프리헨션으로 도전할 차례였다.

고민스러운 부분은 바깥 리스트에서 참고할 행길이(x)를 안쪽에서도 가져다 쓸수 있냐였는데,

흥미롭게도 잘 가져다가 쓴다.

그래서 생각한대로 아래처럼 작성했을때 잘 동작하였다.

def solution1(arr1, arr2):
    answer = [[arr1[x][y]+arr2[x][y]
               for y in range(len(arr1[0]))] for x in range(len(arr1))]
    return answer		#[[4, 6], [7, 9]]

진짜 형태가, 위의 반복문을 그대로 리스트 컴프리헨션으로 작성한 것처럼 되었다.

이렇게 작성했을때 바깥 컴프리헨션의 요소부분인 안쪽 컴프리헨션은,

바깥 컴프리헨션의 x를 잘 참조한다.

(마치 상위 반복문의 x를 하위 반복문에서 잘 가져다가 쓰는것과 같다.)

 

 

결론, 리스트 컴프리헨션 안에서 리스트 컴프리헨션은 사용이 잘되며,

바깥 컴프리헨션의 변수를 잘 참조한다.

그러나 한줄에 많은 단계가 함축되어서 한편으로는 간결하지만,

한편으론 보고 이해하기 어렵기도 하다.

 

내가 원하는 간결함은,

불필요한 부분이 없으면서 스텝마다 한줄로 나누어져,

동작이 한눈에 보이는 것이다.

어쨌든 상황에 따라 활용할 수 있을것 같다.