https://www.acmicpc.net/problem/1080
1080번: 행렬
첫째 줄에 행렬의 크기 N M이 주어진다. N과 M은 50보다 작거나 같은 자연수이다. 둘째 줄부터 N개의 줄에는 행렬 A가 주어지고, 그 다음줄부터 N개의 줄에는 행렬 B가 주어진다.
www.acmicpc.net
문제 풀이
- a, b를 입력받은 후 비교 메서드를 호출한다.
- 3*3으로 뒤집어주기 때문에 n-2, m-2 범위까지만 비교한다. 3*3 범위 중 (0, 0)가 달라서 뒤집어줄 때 나머지도 함께 뒤집히기 때문이다.
- 뒤집기 메서드를 호출할 때마다 count를 하나씩 올린다.
- 뒤집기 작업이 끝난 후에는 모든 행렬 요소를 비교한다. 이때는 n, m의 전체 범위를 기준으로 비교한다.
- 만약 한 개라도 다른 부분이 있다면 바로 -1을 리턴한다.
위 풀이 중 2번이 제일 중요한데, 머릿속으로 행렬을 그려보면 쉽다. 만약 A의 (0, 0)과 B의 (0, 0)이 다르면 뒤집어준다. (0, 0) ... (2, 2)까지 함께 뒤집힌다. 이제 (0, 0)은 다시 뒤집힐 기회가 오지 않는다. 다음은 (0, 1)이다. 즉, 이 탐색에서 A와 B가 다를 경우 무조건 뒤집어줘야 한다. 뒷부분은 신경 안 쓴다. 앞부분이 맞지 않으면 의미 없기 때문에 앞부터 맞춰나간다. 마지막은 (n-2, m-2)를 뒤집어주거나 내버려 두고 끝낸다.
정답 코드
import sys
input = sys.stdin.readline
def change(i, j, a):
for x in range(i, i+3):
for y in range(j, j+3):
a[x][y] = 1 - a[x][y]
def compare():
count = 0
for i in range(n-2):
for j in range(m-2):
if a[i][j] != b[i][j]:
change(i, j, a)
count += 1
for i in range(n):
for j in range(m):
if a[i][j] != b[i][j]:
return -1
return count
n, m = map(int, input().split())
a = [list(map(int, input().strip())) for _ in range(n)]
b = [list(map(int, input().strip())) for _ in range(n)]
print(compare())
'PS > 백준' 카테고리의 다른 글
[백준] 3085번 사탕 게임 (python) (1) | 2024.04.06 |
---|---|
[백준] 2138번 전구와 스위치 (python) (1) | 2024.03.29 |
[백준] 21314번 민겸 수 (python) (0) | 2024.03.26 |
[백준] 14719번 빗물 (python) (0) | 2024.03.22 |
[백준] 16918번 봄버맨 (python) (0) | 2024.03.22 |