[백준] 1080. 행렬

Vincent·2023년 4월 5일

문제 설명

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

제한사항

첫째 줄에 행렬의 크기 N M이 주어진다. N과 M은 50보다 작거나 같은 자연수이다. 둘째 줄부터 N개의 줄에는 행렬 A가 주어지고, 그 다음줄부터 N개의 줄에는 행렬 B가 주어진다.
첫째 줄에 문제의 정답을 출력한다. 만약 A를 B로 바꿀 수 없다면 -1을 출력한다.

풀이

활용개념 : 그리디

def change(i,j):
        for k in range(i,i+3):
            for m in range(j,j+3):
                if arr_1[k][m] == 1:
                    arr_1[k][m] = 0
                else:
                    arr_1[k][m] = 1
                
import sys
N,M = map(int, sys.stdin.readline().split())

arr_1 = [list(map(int, sys.stdin.readline().rstrip())) for i in range(N)]
arr_2 = [list(map(int, sys.stdin.readline().rstrip())) for i in range(N)]
cnt = 0

#3x3 틀을 대보면서 움직이자
for i in range(N-2):
    for j in range(M-2):
        if arr_1[i][j] != arr_2[i][j]:
            change(i,j)
            cnt += 1

if arr_1 != arr_2:
    print(-1)
else:
    print(cnt)

profile
Frontend & Artificial Intelligence

0개의 댓글