[Python] S1 1080번: 행렬

송진영·2023년 8월 20일
0

백준

목록 보기
6/7

문제 풀이

3 곱하기 3 칸씩 뒤집을 수 있기 때문에 2중 for문을 통해서 [0][0]부터 순서대로 행렬이 다를 경우 뒤집는 걸 반복하다 보면 왼쪽 위부터 순서대로 다른 것들만 뒤집기 했기 때문에 이미 뒤집어서 같게 바꿔줬던 건 바뀔 일이 없어서 두 행렬이 같아지는 결과를 얻을 수 있다. 하지만 결과가 다를 경우 -1을 출력해주면 된다.
단, for 문으로 탐색할 때는 그 좌표가 가장 왼쪽 위라고 생각하고 3 곱하기 3이 확보될 때만 뒤집는다.

  1. 2중 for 문으로 왼쪽위부터 순서대로 탐색한다.
  2. 두 행렬이 다를 경우 3 곱하기 3 뒤집기를 한다.
  3. 이것을 끝까지 반복한다.
  4. 두 결과를 비교하여 같으면 count를 출력, 아니면 -1을 출력해준다.

n, m = map(int, input().split()) 
listA = []
for _ in range(n): # 리스트A 선언
    listA.append(list(map(int, list(input()))))
listB = []
for _ in range(n): # 리스트B 선언
    listB.append(list(map(int, list(input()))))


def check(i, j): # 뒤집기 함수
    for x in range(i, i+3):
        for y in range(j, j+3):
            if listA[x][y] == 0:
                listA[x][y] = 1
            else:
                listA[x][y] = 0


cnt = 0 # 카운트
if (n < 3 or m < 3) and listA != listB:
    # 예외 1, 리스트가 작을 때
    cnt = -1
else:
    for r in range(n-2):
        for c in range(m-2):
            if listA[r][c] != listB[r][c]:
                cnt += 1
                check(r, c)

if cnt != -1:
    if listA != listB: # A와 B가 같은지 확인
        cnt = -1
print(cnt)
profile
못하는 건 없다. 단지 그만큼 노력을 안 할 뿐이다.

0개의 댓글