[BOJ] 1080 행렬 바로가기
0과 1로만 이루어진 행렬 A와 행렬 B가 있다. 이때, 행렬 A를 행렬 B로 바꾸는데 필요한 연산의 횟수의 최솟값을 구하는 프로그램을 작성하시오.
행렬을 변환하는 연산은 어떤 3×3크기의 부분 행렬에 있는 모든 원소를 뒤집는 것이다. (0 → 1, 1 → 0)
첫째 줄에 행렬의 크기 N M이 주어진다. N과 M은 50보다 작거나 같은 자연수이다. 둘째 줄부터 N개의 줄에는 행렬 A가 주어지고, 그 다음줄부터 N개의 줄에는 행렬 B가 주어진다.
첫째 줄에 문제의 정답을 출력한다. 만약 A를 B로 바꿀 수 없다면 -1을 출력한다.
✍ 코드
from sys import stdin
# 3 X 3 크기의 부분 배열 값 0 → 1, 1 → 0 으로 변환
def Change(x, y):
for i in range(y, y+3):
for j in range(x, x+3):
B[i][j] = 1 - B[i][j]
A, B = [], []
count = 0
N, M = map(int,stdin.readline().split()) # 세로, 가로
for _ in range(N):
A.append(list(map(int,stdin.readline().rstrip())))
for i in range(N):
B.append(list(map(int,stdin.readline().rstrip())))
for y in range(N-2):
for x in range(M-2):
if A[y][x] != B[y][x]: # 현재 위치의 값이 다르다면
Change(x, y) # 3 X 3 부분행렬 변환 함수 실행
count += 1 # count 1 증가
if A != B: # A 행렬과 B 행렬이 다르다면
print(-1)
else:
print(count)