문제 출처 : www.acmicpc.net/problem/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을 출력한다.
내 풀이
n, m = map(int, input().split())
arr1 = []
arr2 = []
answer = 0
for i in range(n):
arr1.append(list(map(int, input())))
for i in range(n):
arr2.append(list(map(int, input())))
def change(x, y):
for i in range(x, x + 3):
for j in range(y, y + 3):
arr1[i][j] = 1 - arr1[i][j]
def check():
for i in range(n):
for j in range(m):
if arr1[i][j] != arr2[i][j]:
return False
return True
for i in range(n-2):
for j in range(m-2):
if arr1[i][j] != arr2[i][j]:
change(i, j)
answer += 1
if check() == False:
print(-1)
else:
print(answer)
입력 받은 행렬을 시작부터 한칸 씩 비교해가며 일치하지 않을 경우 3x3범위의 행렬의 수를 바꿔주면 되는 문제였다.
'코딩테스트' 카테고리의 다른 글
[백준][파이썬]1744 수 묶기 (0) | 2021.03.27 |
---|---|
[백준][파이썬]11497 통나무 건너뛰기 (0) | 2021.03.25 |
[백준][파이썬]1449 수리공 항승 (0) | 2021.03.23 |
[백준][파이썬]1931 회의실 배정 (0) | 2021.03.23 |
[백준][파이썬] 1946 신입사원 (0) | 2021.03.22 |