728x90
문제 출처: https://www.acmicpc.net/problem/1080
문제
0과 1로만 이루어진 행렬 A와 행렬 B가 있다. 이때, 행렬 A를 행렬 B로 바꾸는데 필요한 연산의 횟수의 최솟값을 구하는 프로그램을 작성하시오.
행렬을 변환하는 연산은 어떤 3×3크기의 부분 행렬에 있는 모든 원소를 뒤집는 것이다. (0 → 1, 1 → 0)
입력
첫째 줄에 행렬의 크기 N M이 주어진다. N과 M은 50보다 작거나 같은 자연수이다. 둘째 줄부터 N개의 줄에는 행렬 A가 주어지고, 그 다음줄부터 N개의 줄에는 행렬 B가 주어진다.
출력
첫째 줄에 문제의 정답을 출력한다. 만약 A를 B로 바꿀 수 없다면 -1을 출력한다.
정답
import sys
N, M = map(int, sys.stdin.readline().split())
A = [list(map(int, sys.stdin.readline().rstrip())) for _ in range(N)]
B = [list(map(int, sys.stdin.readline().rstrip())) for _ in range(N)]
cnt = 0
def mat(i, j):
for x in range(i, i + 3):
for y in range(j, j + 3):
A[x][y] = 1 - A[x][y]
for i in range(N - 2):
for j in range(M - 2):
if A[i][j] != B[i][j]:
mat(i, j)
cnt += 1
if A == B:
break
if A == B:
break
if A != B:
print(-1)
else:
print(cnt)
2중 for문에서 다를 경우 함수 불러서 변경하는 형식입니다.
728x90
'코딩 > 백준' 카테고리의 다른 글
[백준/파이썬/자료구조] 11478번 서로 다른 부분 문자열의 개수 코딩테스트 연습풀이 (0) | 2022.08.19 |
---|---|
[백준/파이썬/그래프] 5567번 결혼식 코딩테스트 연습풀이 (0) | 2022.08.18 |
[백준/파이썬/DP] 1965번 상자넣기 코딩테스트 연습풀이 (0) | 2022.08.16 |
[백준/파이썬/브루트포스] 1747번 소수&팰린드롬 코딩테스트 연습풀이 (0) | 2022.08.15 |
[백준/파이썬/자료구조] 2075번 N번째 큰 수 코딩테스트 연습풀이 (0) | 2022.08.14 |