문제 :
쉬운 문제이지만 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 - elem for elem in reversed_row]
- reversed_row의 각 elem에 대해 1 - elem을 계산.
- elem이 1이면 1 - 1 = 0이 된다.
- elem이 0이면 1 - 0 = 1이 된다.
- 요소별로 변환:
- 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문을 사용할 필요 없이, 간단하게 표현 해주면 된다.
'CodingTest > Leetcode' 카테고리의 다른 글
[LeetCode] 922. Sort Array By Parity II (0) | 2024.07.17 |
---|---|
[LeetCode] 876. Middle of the Linked List (0) | 2024.07.17 |
[LeetCode] 557. Reverse Words in a String III (0) | 2024.07.10 |
[LeetCode] 541. Reverse String II (1) | 2024.07.09 |
[LeetCode] 345. Reverse Vowels of a String (0) | 2024.07.04 |