[백준] 1080번 - 행렬

yerimstar·2021년 10월 7일
0

그리디

목록 보기
3/10

아이디어

한 칸씩 이동하며, 3X3 행렬을 검사하는 방식으로 문제를 해결하였습니다.
이때, -1이 나올 수 있는 경우를 생각하여 추가적으로 예외처리를 하였습니다.

1차 코드

# 행렬
import sys
N,M = map(int,sys.stdin.readline().split())
A = [list(map(int,input())) for _ in range(N)]
B = [list(map(int,input()))for _ in range(N)]

if N < 3 or M < 3: # 3x3 행렬을 만들 수 없는 경우 -> -1 출력 (반례)
    print(-1)
    exit()

count = 0
for i in range(N-2):
    for j in range(M-2):
        if A[i][j] != B[i][j]:
            count += 1
            for n in range(3):
                for m in range(3):
                    if A[i+n][j+m] == 0:
                        A[i+n][j+m] =1
                    elif A[i+n][j+m] == 1:
                        A[i + n][j + m] = 0
        if A == B:
            break

if A != B: # 3x3을 모두 시도해봐도 행렬이 다른 경우 -> -1 출력 (반례)
    print(-1)
else:
    print(count)

나름 반례를 생각하며 문제를 풀었는데도 60%에서 "틀렸습니다"가 떴습니다.

2차 코드

# 행렬
import sys
N,M = map(int,sys.stdin.readline().split())
A = [list(map(int,input())) for _ in range(N)]
B = [list(map(int,input()))for _ in range(N)]

if N < 3 or M < 3: # 3x3 행렬을 만들 수 없는 경우 -> -1 출력 (반례)
    if A == B:
        print(0)
    else:
        print(-1)
    exit()

count = 0
for i in range(N-2):
    for j in range(M-2):
        if A[i][j] != B[i][j]:
            count += 1
            for n in range(3):
                for m in range(3):
                    if A[i+n][j+m] == 0:
                        A[i+n][j+m] =1
                    elif A[i+n][j+m] == 1:
                        A[i + n][j + m] = 0
        if A == B:
            break

if A != B: # 3x3을 모두 시도해봐도 행렬이 다른 경우 -> -1 출력 (반례)
    print(-1)
else:
    print(count)

N또는 M값이 3보다 작을 때, 두 행렬이 같은 경우에 대한 조건을 넣어주니 맞았습니다.

profile
백엔드 개발자

0개의 댓글