Computer >> 컴퓨터 >  >> 프로그래밍 >> Python

파이썬으로 이미지 수평 뒤집기 & 반전하기: 단계별 구현 가이드

문제 개요

이진 행렬(binary matrix) A가 하나의 이미지를 나타낸다고 가정해 보겠습니다. 우리는 이 이미지를 수평으로 뒤집은(flip) 후, 다시 반전(invert)시켜서 최종 결과 이미지를 반환해야 합니다.

여기서 각 연산의 의미는 다음과 같습니다.

  • 수평 뒤집기: 이미지의 각 행을 좌우로 거꾸로 배치합니다.
  • 반전: 모든 0을 1로, 모든 1을 0으로 바꿉니다.

입력 예시

110
101
000

출력 결과

100
010
111

예를 들어 첫 번째 행 [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을 반환하므로 반전 처리에 특히 적합합니다. 이 방식은 코드가 짧아질 뿐만 아니라 가독성과 실행 효율 면에서도 유리합니다.