[백준/Python] 1080_행렬

2021. 7. 3. 15:21백준 알고리즘

문제

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

 

1080번: 행렬

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

www.acmicpc.net

코드

import sys


def convert_matrix(r, c, matrix):
    for i in range(r, r + 3):
        for j in range(c, c + 3):
            matrix[i][j] = 1 - matrix[i][j]


n, m = map(int, sys.stdin.readline().rstrip().split())
standard_matrix = []  # 기준 행렬
change_matrix = []  # 수정할 행렬
for _ in range(n):
    standard_matrix.append(list(map(int, list(sys.stdin.readline().rstrip()))))
for _ in range(n):
    change_matrix.append(list(map(int, list(sys.stdin.readline().rstrip()))))
convert_cnt = 0  # 뒤집는 횟수

for i in range(n - 2):
    for j in range(m - 2):
        if standard_matrix[i][j] != change_matrix[i][j]:
            convert_matrix(i, j, change_matrix)
            convert_cnt += 1

for i in range(n):
    for j in range(m):
        if standard_matrix[i][j] != change_matrix[i][j]:
            print(-1)
            exit(0)
print(convert_cnt)

풀이

기준 행렬과 수정할 행렬을 각각 standard_matrix, change_matrix 2차원 배열에 저장합니다.

3*3 부분 행렬의 맨 왼쪽 위의 row, column값을 입력받아서 해당 부분 행렬을 뒤집는 함수 convert_matrix를 선언합니다.

행렬의 (0,0)지점부터 (n-2, m-2)지점까지 순회하면서 change_matrix의 값과 standard_matrix의 값이 다를 때 부분 행렬을 뒤집습니다.

뒤집을 때마다 convert_cnt에 1을 더합니다.

반복문이 모두 종료되면 두 행렬을 비교하여 일치하면 convert_cnt를 출력하고, 하나라도 다른게 존재하면 -1을 출력합니다.