코딩테스트
[백준/파이썬] 1080 행렬
Sun0727
2023. 1. 5. 21:58
#문제링크
https://www.acmicpc.net/problem/1080
1080번: 행렬
첫째 줄에 행렬의 크기 N M이 주어진다. N과 M은 50보다 작거나 같은 자연수이다. 둘째 줄부터 N개의 줄에는 행렬 A가 주어지고, 그 다음줄부터 N개의 줄에는 행렬 B가 주어진다.
www.acmicpc.net
#나의풀이
import sys
def reverse(x, y):
for i in range(x,x+3):
for j in range(y, y+3):
first_matrix[i][j] = 1 - first_matrix[i][j]
if __name__=="__main__":
N, M = map(int, sys.stdin.readline().split())
first_matrix = [[0] * M for _ in range(N)]
second_matrix = [[0] * M for _ in range(N)]
count = 0
flag = False
for i in range(N):
S = sys.stdin.readline().strip()
for j in range(M):
first_matrix[i][j] = int(S[j])
for i in range(N):
S = sys.stdin.readline().strip()
for j in range(M):
second_matrix[i][j] = int(S[j])
for i in range(N-2):
for j in range(M-2):
if first_matrix[i][j] != second_matrix[i][j]:
reverse(i, j)
count += 1
if first_matrix == second_matrix:
break
if first_matrix == second_matrix:
break
if first_matrix != second_matrix:
print(-1)
else:
print(count)
#해설
그리디 문제라고 해서 골랐는데 왜 그리디인지 다른사람의 설명을 보고 이해했다.
주어진 문제에서는 숫자가 0과 1로 주어지는데 두 행렬을 비교하여 값이 다르면 무조건 뒤집어줘야 하기 때문에 그리디 문제로 분류된다라고 하셨다.
각 행렬을 첫번째와 두번째로 나누어 받고 뒤집는건 3x3이므로 각 행렬의 row, column을 -2씩 해서 for문을 돌려줬다.(혹시 이부분이 이해가 안된다면 직접 해보거나 스도쿠 문제를 풀어보세요)
이후 첫번째행렬의 값과 두번째행렬의 값이 다르면 reverse함수로 뒤집는다.
reverse 함수는 간단하게 2진수를 생각하면 되는데 0은 1이되야하고 1은 0이 되어야 하기때문에 1 - 값을 하면 충족하게 된다.
이후 두 행렬이 같다면 break문을 사용해서 빨리 끝내주었다