문제
![](https://velog.velcdn.com/images%2Fcosmos%2Fpost%2F8179db4b-d487-46c5-b5e1-a568bd938cd1%2F%E1%84%89%E1%85%B3%E1%84%8F%E1%85%B3%E1%84%85%E1%85%B5%E1%86%AB%E1%84%89%E1%85%A3%E1%86%BA%202022-01-19%20%E1%84%8B%E1%85%A9%E1%84%92%E1%85%AE%202.32.56.png)
풀이
- 시간 제한: 2초
- 0과 1로만 이루어진 행렬 a와 행렬 b가 있다.
- 행렬 a를 행렬 b로 바꾸는데 필요한 연산의 횟수와 최솟값을 구하는 프로그램을 작성하라.
- 첫째 줄에 행렬의 크기 n m이 주어진다.
- n과 m은 50보다 작거나 같은 자연수이다.
- 둘째 줄부터 n개의 줄에는 행렬 a가 주어지고, 그 다음줄부터 n개의 줄에는 행렬 b가 주어진다.
- 첫째 줄에 문제의 정답을 출력한다.
- 만약 a를 b로 바꿀 수 없다면 -1을 출력한다.
-> 이 문제는 말이 행렬이지 실상은 a와 b가 같아질때까지 3x3 구간을 반전시키는 문제로 3x3 오델로 구현 문제이다.
-> (3x3->1), (3x4->2), (3x5->3), (4x4->4), (5x5->9), (4x4->16)로 실행 횟수가 되는걸로보아 (n -2) * (m - 2) 패턴을 가진걸 확인할 수 있다.
-> 본인은 행렬 반전을 할 줄 몰라 (조건문 + 변수 값 할당)으로 구현하였으나 인터넷에 찾아보니 행렬 = 1 - 행렬을 하면 값 반전이 되는걸로 보인다.
코드
import sys
input = sys.stdin.readline
def othello(matrix, x, y):
for i in range(3):
for j in range(3):
if matrix[x+i][y+j] == '0':
matrix[x+i][y+j] = '1'
else:
matrix[x+i][y+j] = '0'
def solve(n, m, matrix_a, matrix_b):
cnt = 0
for x in range(n-2):
for y in range(m-2):
if matrix_a[x][y] != matrix_b[x][y]:
othello(matrix_a, x, y)
cnt += 1
return -1 if matrix_a != matrix_b else cnt
if __name__ == '__main__':
n, m = map(int, input().split())
matrix_a = [list(map(str, input())) for _ in range(n)]
matrix_b = [list(map(str, input())) for _ in range(n)]
print(solve(n, m, matrix_a, matrix_b))
결과
![](https://velog.velcdn.com/images%2Fcosmos%2Fpost%2F38945b76-2d7c-4b13-a99f-ab1a6b5b8aee%2F%E1%84%89%E1%85%B3%E1%84%8F%E1%85%B3%E1%84%85%E1%85%B5%E1%86%AB%E1%84%89%E1%85%A3%E1%86%BA%202022-01-19%20%E1%84%8B%E1%85%A9%E1%84%92%E1%85%AE%203.37.13.png)
출처 & 깃허브
boj
github