1080번: 행렬
첫째 줄에 행렬의 크기 N M이 주어진다. N과 M은 50보다 작거나 같은 자연수이다. 둘째 줄부터 N개의 줄에는 행렬 A가 주어지고, 그 다음줄부터 N개의 줄에는 행렬 B가 주어진다.
www.acmicpc.net
- 특정 위치에서 뒤집을 경우, 3x3 만큼의 크기를 반드시 뒤집는다.
- 따라서 N-2, N-1 인덱스 같은 위치에서는 뒤집기 연산을 수행할 수 없다.
- 뒤집기 연산의 특성상, [0][0] 을 제외하고 나머지 위치에서는 [0][0] 을 절대 업데이트 할 수 없다.
- 마찬가지로 왼쪽 위부터 오른쪽 아래까지 순서대로 한번씩 뒤집어나간다고 할 때, 이미 지나간 위치에 대해서는 다른 위치에서 뒤집기 연산을 한다고 해도 바뀔 수가 없다.
- 따라서 A와 B를 [0][0], [0][1], [0][2] ... 순서대로 해당 위치의 값을 하나씩 확정시켜나가며 뒤집어준다.
N, M = map(int, input().split())
A = [list(map(int, input())) for i in range(N)]
B = [list(map(int, input())) for i in range(N)]
def check(): # A 와 B 두 행렬이 같은지 검사하는 함수
for i in range(N):
for j in range(M):
if A[i][j] != B[i][j]:
return False
return True
def push(r, c): # 특정 위치에서 3x3 을 뒤집어주는 함수
for i in range(3):
for j in range(3):
A[r+i][c+j] = int(not A[r+i][c+j])
if N < 3 or M < 3: # 애초에 뒤집을 수 없는 행렬이라면 검사하고 종료
print(0 if check() else -1)
else:
cnt = 0
for i in range(N-2): # [0][0] 부터 [N-3][M-3] 행렬을 검사
for j in range(M-2):
if A[i][j] != B[i][j]: # 만약 값이 다르다면
push(i, j) # 헤딩 위치에서 뒤집어주고
cnt += 1 # 처리
if check():
print(cnt)
if not check(): # 전체 검사 후에도 행렬이 다르다면 -1 출력
print(-1)
'PS > BOJ' 카테고리의 다른 글
[백준] 2263 : 트리의 순회 (0) | 2021.05.07 |
---|---|
[백준] 11404 : 플로이드 (0) | 2021.05.06 |
[백준] 11664 : 선분과 점 (0) | 2021.05.04 |
[백준] 10830 : 행렬 제곱 (0) | 2021.05.02 |
[백준] 16928 : 뱀과 사다리 게임 (0) | 2021.05.01 |