본문 바로가기
Algorithm/백준 알고리즘 풀이

[Baekjoon] 1080. 행렬 ( 탐욕 알고리즘 )

by newnu 2021. 5. 16.
반응형

# Problem

0과 1로만 이루어진 행렬 A와 행렬 B가 있다. 이때, 행렬 A를 행렬 B로 바꾸는데 필요한 연산의 횟수의 최솟값을 구하는 프로그램을 작성하시오.
행렬을 변환하는 연산은 어떤 3*3크기의 부분 행렬에 있는 모든 원소를 뒤집는 것이다. (0 -> 1, 1 -> 0)


입력


첫째 줄에 행렬의 크기 N M이 주어진다. N과 M은 50보다 작거나 같은 자연수이다. 둘째 줄부터 N개의 줄에는 행렬 A가 주어지고, 그 다음줄부터 N개의 줄에는 행렬 B가 주어진다.


출력


첫째 줄에 문제의 정답을 출력한다. 만약 A를 B로 바꿀 수 없다면 -1을 출력한다.




 

# Solution 

n,m = map(int,input().split())
a = [list(map(int,input()))for _ in range(n)]
b = [list(map(int,input()))for _ in range(n)]

def flip(x,y,z):
    for i in range(3):
        for j in range(3):
            z[x+i][y+j]^=1
    
ans=0
for i in range(n-2):
    for j in range(m-2):
        if a[i][j] !=b[i][j]:
            flip(i,j,a)
            ans+=1
            
print(ans if a==b else -1)

^ (XOR) 연산자

a[x+i][y+j] ^= 1

a[x+i][y+j] 가 0 이면 -> 1

a[x+i][y+j] 가 1 이면 -> 0

반응형