알고리즘 문제(SOL)
[백준/1080/파이썬] 행렬
Mapin
2022. 4. 5. 16:59
https://www.acmicpc.net/problem/1080
Problem
- 0과 1로만 이루어진 행렬 A와 행렬 B가 있다. 이때, 행렬 A를 행렬 B로 바꾸는데 필요한 연산의 횟수의 최솟값을 구하는 프로그램을 작성하시오.
- 행렬을 변환하는 연산은 어떤 3×3크기의 부분 행렬에 있는 모든 원소를 뒤집는 것이다. (0 → 1, 1 → 0)
조건
- 첫째 줄에 행렬의 크기 N M이 주어진다. N과 M은 50보다 작거나 같은 자연수이다. 둘째 줄부터 N개의 줄에는 행렬 A가 주어지고, 그 다음줄부터 N개의 줄에는 행렬 B가 주어진다.
SOL
단순한 시뮬레이션 문제이다. 입력받은 행렬과 goal 행렬이 일단 다르면, 뒤집어 줘야한다.
모든 행렬을 다 뒤집어 봤을 때, 같은지 확인해주고, 같지않다면 이건 어떻게 뒤집어도 못만드는 행렬이기 때문에,
-1을 출력해준다.
# 3x3 행렬을 뒤집는 연산
import sys
input= sys.stdin.readline
N,M =map(int,input().split())
board=[list(map(int,input().rstrip())) for _ in range(N)]
goal_board=[list(map(int,input().rstrip())) for _ in range(N)]
def Is_Same_board():
for i in range(N):
for j in range(M):
if board[i][j] !=goal_board[i][j]:
return False
return True
def switch_board(y,x):
for i in range(y,y+3):
for j in range(x,x+3):
board[i][j] = 1-board[i][j]
Time=0
for i in range(N-2):
for j in range(M-2):
if board[i][j] != goal_board[i][j]:
switch_board(i,j)
Time+=1
if Is_Same_board():
print(Time)
else:
print(-1)