알고리즘 문제(SOL)

[백준/1080/파이썬] 행렬

Mapin 2022. 4. 5. 16:59

https://www.acmicpc.net/problem/1080

 

1080번: 행렬

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

www.acmicpc.net

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)