알고리즘

[백준] 1080 - 행렬

j9972 2023. 5. 8. 16:50
728x90

1. 문제

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

 

1080번: 행렬

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

www.acmicpc.net

 

2. 접근

1. 3 X 3의 행렬을  뒤집는다는것을 생각해서 overturn 함수의 3칸을 어떻게 처리할지를 많이 고민했다 ( 근데 간단하게 range를 (x,x+3) 이렇게 표현하면 된다...) ,, 처음에는 3X3처리에 대해서 막상 생각이 나지 않았었다 

2. n<3, m<3 인 경우에는 뒤집을 수 가 없어서 무조건 -1을 출력한다고 착각할 수 있다. 여기서 n<3, m<3 일때, a_matrix == b_matrix 라면, -1이 아닌 0이 출력 되어야 한다는것을 생각하자

3. 2차 반복문을 돌리면서 특정 지점이 a_matrix[i][j] != b_matrix [i][j] 라면 뒤집어 주는 함수를 실행하고 cnt를 증가 시키자

4. n<3, m<3 외에도 a_matrix == b_matrix 을 만들 수 없는 경우는 -1을 출력하도록 해주자 ( 34번 라인 )

 

3. 풀이

import sys
input = sys.stdin.readline

n,m = map(int,input().split())

a_matrix = []
for i in range(n):
    a_matrix.append(list(map(int,input().rstrip())))

b_matrix = []
for i in range(n):
    b_matrix.append(list(map(int,input().rstrip())))

def overturn(x,y):
    for i in range(x,x+3):
        for j in range(y,y+3):
            if a_matrix[i][j] == 0:
                a_matrix[i][j] = 1
            else:
                a_matrix[i][j] = 0

cnt = 0
# n<3,m<3 인데 a_matrix,b_matrix 가 같으면 cnt는 -1 이 아니니까 a_matrix != b_matrix 조건 필요
if (n < 3 or m < 3) and a_matrix != b_matrix:
    cnt = -1
else:
    for i in range(n-2): # 0 부터 범위 시작이니까 -2가 맞다
        for j in range(m-2):
            if a_matrix[i][j] != b_matrix[i][j]:
                overturn(i,j)
                cnt += 1

if cnt != -1:
    if a_matrix != b_matrix:
        cnt = -1

print(cnt)