[알고리즘] BOJ 1080 행렬

김상현·2022년 4월 23일
0

알고리즘

목록 보기
89/301
post-thumbnail

[BOJ] 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을 출력한다.


📍 풀이

✍ 코드

from sys import stdin

# 3 X 3 크기의 부분 배열 값 0 → 1, 1 → 0 으로 변환
def Change(x, y): 
  for i in range(y, y+3):
    for j in range(x, x+3):
      B[i][j] = 1 - B[i][j]

A, B = [], []
count = 0
N, M = map(int,stdin.readline().split()) # 세로, 가로
for _ in range(N):
  A.append(list(map(int,stdin.readline().rstrip())))
for i in range(N):
  B.append(list(map(int,stdin.readline().rstrip())))

for y in range(N-2):
  for x in range(M-2):
    if A[y][x] != B[y][x]: # 현재 위치의 값이 다르다면
      Change(x, y) # 3 X 3 부분행렬 변환 함수 실행
      count += 1 # count 1 증가

if A != B: # A 행렬과 B 행렬이 다르다면
  print(-1)
else:
  print(count)
profile
목적 있는 글쓰기

0개의 댓글