문제 개요
이진 행렬(binary matrix) A가 하나의 이미지를 나타낸다고 가정해 보겠습니다. 우리는 이 이미지를 수평으로 뒤집은(flip) 후, 다시 반전(invert)시켜서 최종 결과 이미지를 반환해야 합니다.
여기서 각 연산의 의미는 다음과 같습니다.
- 수평 뒤집기: 이미지의 각 행을 좌우로 거꾸로 배치합니다.
- 반전: 모든 0을 1로, 모든 1을 0으로 바꿉니다.
입력 예시
| 1 | 1 | 0 |
| 1 | 0 | 1 |
| 0 | 0 | 0 |
출력 결과
| 1 | 0 | 0 |
| 0 | 1 | 0 |
| 1 | 1 | 1 |
예를 들어 첫 번째 행 [1, 1, 0]은 뒤집으면 [0, 1, 1]이 되고, 여기에 반전을 적용하면 [1, 0, 0]이 됩니다.
해결 알고리즘
다음 단계를 따라 문제를 해결할 수 있습니다.
- 결과를 담을 새 리스트(result)를 생성합니다.
- A의 각 행 i에 대해 다음을 수행합니다.
- 해당 행을 역순으로 뒤집어 Reverse를 만듭니다.
- Reverse의 각 요소 j를 순회하면서 값이 1이면 0으로, 그렇지 않으면 1로 변경합니다.
- 변환이 완료된 Reverse를 result의 끝에 추가합니다.
- 모든 행의 처리가 끝나면 result를 반환합니다.
구현 예제
class Solution: def flipAndInvertImage(self, A): result = [] for i in A: Reverse = i[::-1] for j in range(len(Reverse)): if Reverse[j] == 1: Reverse[j] = 0 else: Reverse[j] = 1 result.append(Reverse) return result ob = Solution() print(ob.flipAndInvertImage([[1,1,0],[1,0,1],[0,0,0]]))
입력
[[1,1,0],[1,0,1],[0,0,0]]
출력
[[1, 0, 0], [0, 1, 0], [1, 1, 1]]
더 간결한 파이썬스러운 방법
위 코드는 리스트 컴프리헨션(list comprehension)을 사용하면 한 줄로도 작성할 수 있습니다. 슬라이싱 [::-1]로 행을 뒤집고, 1 - x 또는 비트 연산자 1 ^ x(XOR)를 이용하면 0과 1을 손쉽게 반전할 수 있습니다.
def flipAndInvertImage(A): return [[1 ^ x for x in row[::-1]] for row in A] print(flipAndInvertImage([[1,1,0],[1,0,1],[0,0,0]])) # 출력: [[1, 0, 0], [0, 1, 0], [1, 1, 1]]
XOR 연산(^)은 비트가 0일 때 1을, 1일 때 0을 반환하므로 반전 처리에 특히 적합합니다. 이 방식은 코드가 짧아질 뿐만 아니라 가독성과 실행 효율 면에서도 유리합니다.