문제 :

 

쉬운 문제이지만 2차원 리스트에 익숙하지 않은 이슈 + 리스트 컴프리헨션을 까먹었던 이슈로 다시 한번 기억하고자 포스팅을 한다.

 

우선, 입력값으로 2차원 리스트가 주어지고, 이 리스트의 행을 반전시킨 후 + 각 리스트의 숫자가 1이면 0으로, 0이면 1로 바꿔줘야 한다.

 

아래는 내가 제출해 통과한 코드이다.

 

class Solution:
    def flipAndInvertImage(self, image: List[List[int]]) -> List[List[int]]:
        
        for idx, row in enumerate(image):
            reversed = row[::-1]
            image[idx] = [1 - elem for elem in reversed]
        return image
더보기

2차원 리스트의 요소 참조하는법

예를 들어, 이런 2차원 리스트가 있다고 치자:

matrix = [
    [1, 2, 3],
    [4, 5, 6],
    [7, 8, 9]
]

이 리스트의 요소를 참조하려면 두 개의 인덱스를 사용한다. 첫 번째 인덱스는 바깥 리스트(행)를, 두 번째 인덱스는 안쪽 리스트(열)를 가리킨다.

예를 들어:
- `matrix[0][0]`은 1을 반환한다. (첫 번째 행, 첫 번째 열)
- `matrix[1][2]`는 6을 반환한다. (두 번째 행, 세 번째 열)
- `matrix[2][1]`은 8을 반환한다. (세 번째 행, 두 번째 열)

전체 행을 참조하려면 하나의 인덱스만 사용하면 된다:
- `matrix[0]`은 [1, 2, 3]을 반환한다. (첫 번째 행 전체)


- enurmate(image)를 사용해 2차원 리스트를 순회할때, 인덱스와 row전체를 한번에 가져올 수 있도록 한다. 여기서 idx에는 현재 비교중인 row의 인덱스가 담기고, 이 row라는 변수에는 현재 비교중인 행(리스트)이 담긴다.

 

- row[::-1]을 이용해 현재 비교중인 행을 역순으로 뒤집는다.

 

- 첫번째 반복문의 image[idx]는 image[0]일 것이며, 이건 2차원 리스트의 첫번째 행을 가리킨다.

 

이제 여기서 리스트 컴프리헨션이 등장한다.

더보기
[expression for item in iterable]

이 형식은 iterable의 각 item에 대해 expression을 평가하여 새로운 리스트를 만든다.

구체적인 예제

예를 들어, reversed_row가 [1, 0, 1]이라고 가정해보자. 이 값을 반전시키기 위해 다음 단계를 수행한다:

  1. 리스트 내포 사용: [1 - elem for elem in reversed_row]
    • reversed_row의 각 elem에 대해 1 - elem을 계산.
    • elem이 1이면 1 - 1 = 0이 된다.
    • elem이 0이면 1 - 0 = 1이 된다.
  2. 요소별로 변환:
    • reversed_row = [1, 0, 1]일 때,
    • 1 - 1 = 0이 되고,
    • 1 - 0 = 1이 되며,
    • 1 - 1 = 0이 된다.

결과적으로, [1 - elem for elem in reversed_row]는 [0, 1, 0]이 된다.

 

이 컴프리헨션을 이용해 복잡하게 이중 for문을 사용할 필요 없이, 간단하게 표현 해주면 된다.

+ Recent posts