Hanbit the Developer

[Python] 백준 1080번: 행렬 본문

Algorithm/백준

[Python] 백준 1080번: 행렬

hanbikan 2021. 5. 24. 11:54

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

 

1080번: 행렬

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

www.acmicpc.net

import sys
input = sys.stdin.readline


def convertMatrix(x, y):
    if not (0 <= x <= N-3 and 0 <= y <= M-3):
        return -1

    global matrixA

    for i in range(3):
        for j in range(3):
            matrixA[x+i][y+j] = not matrixA[x+i][y+j]

    return 0


def isDone():
    for i in range(N):
        for j in range(M):
            if matrixA[i][j] == True:
                return -1

    return 0


def printMatrix():
    for i in range(N):
        print(matrixA[i])


N, M = map(int, input().split())

matrixA = []
for _ in range(N):
    curList = []
    curLine = input().rstrip()
    for c in curLine:
        curList.append(int(c))
    matrixA.append(curList)

for i in range(N):
    curList = []
    curLine = input().rstrip()
    for j in range(M):
        if int(curLine[j]) == matrixA[i][j]:
            matrixA[i][j] = False
        else:
            matrixA[i][j] = True

conversionCount = 0
for i in range(N-2):
    for j in range(M-2):
        if matrixA[i][j] == True:
            if convertMatrix(i, j) == 0:
                conversionCount += 1

if isDone() == 0:
    print(conversionCount)
else:
    print(-1)

 

우선 matrixA가, 서로 다른 값을 갖고 있는지를 True/False로서 저장하도록 코드를 짜준다.

이후에는 (0, 0) ~ (N-3, M-3)까지 for문을 돌아주면서, 만약 해당 인덱스가 True(해당 위치에서의 값이 서로 다르다는 의미)이면 convertMatrix() 연산을 수행해준다.

이 심플한 과정을 마치고 난 후에, isDone()을 통해 A에서 B로 바꿀 수 있는지를 확인하고 이에 따라 결과를 출력해준다.