백준 1080번 - 행렬

행렬 문제 바로 가기

풀이 날짜: 2026-01-31

baekjoon 알고리즘 문제 풀이

풀이 코드


import sys
input = sys.stdin.readline

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)]

def flip(x,y):
    for i in range(x,x+3):
        for j in range(y,y+3):
            a[i][j] = 1 - a[i][j]

count = 0
for i in range(n-2):
    for j in range(m-2):
        if a[i][j] != b[i][j]:
            flip(i,j)
            count += 1

if a==b:
    print(count)
else:
    print(-1)
  

문제 접근

단순히 행렬을 비교하는 문제처럼 보였지만, 실제로는 조건을 정확히 이해하지 못하면 어디서부터 손대야 할지 막막한 문제였다. 특히 “3×3 뒤집기”라는 제한 때문에 자유롭게 값을 바꿀 수 없다는 점이 처음에는 잘 와닿지 않았다.


가장 헷갈렸던 부분: 범위 설정

for i in range(n - 2), for j in range(m - 2)처럼 반복문의 범위를 왜 -2까지로 제한해야 하는지 이해하는 데 시간이 걸렸다. 단순히 인덱스 에러를 피하기 위한 것이라고 생각했는데, 실제로는 3×3 뒤집기의 시작 위치(좌상단)를 정하는 핵심 조건이라는 점을 나중에야 이해하게 되었다. 3×3 뒤집기를 적용하려면 시작 위치에서 아래와 오른쪽으로 각각 2칸의 여유가 필요하다. 따라서 행과 열 모두 n-2, m-2까지만 순회해야 하며, 이는 단순한 인덱스 에러 방지가 아니라 문제 조건 자체를 반영한 범위 설정이다.


3×3 뒤집기 함수

이 함수는 (x, y)를 좌상단으로 하는 3×3 영역의 값을 한 번에 뒤집는다. 0은 1로, 1은 0으로 바꾸기 위해 1 - 값 형태를 사용했다. 이 함수는 실제로 값을 변경하는 핵심 연산이기 때문에, 문제의 본질을 가장 잘 드러내는 부분이다.


회고

이 문제는 구현 자체보다도 조건 해석과 인덱스 범위에 대한 이해가 훨씬 중요했다. 특히 왜 특정 범위까지만 탐색하는지, 왜 그 위치에서 바로 뒤집어야 하는지를 이해하고 나니 전체 풀이 흐름이 명확해졌다. 처음에는 많이 어려웠지만, 한 단계씩 뜯어보며 생각하는 연습이 된 문제였다.