-문제 : https://www.acmicpc.net/problem/1080 

 

처음에 풀었을 때 되게 어렵게 느껴졌던 문제였는데, 다시 풀어보니까 그렇게 어렵지는 않았다 

문제에서 연산은 3x3 행렬 단위로 이루어진다고해서 3x3 행렬 단위로 진행해야된다고 생각했다. 

그런데 차근차근 3x3단위로 이동해야한다고 생각해 이중 반복문을 생각했는데 이게 아니라

 

완전 탐색하면서 다른 지점이 있을 때마다 3x3 단위로 변환을 하면 된다. 

변환하는 것은 1-원래값으로 한다 

다른 블로그에는 위 방식이었지만, 나는 이해가 가지 않아 그냥 조건에 따라서 값을 변경하는 것으로 바꿨다

변환할 때마다 연산횟수를 더해가면 된다

완전 탐색시 범위가 중요한데 3x3단위로 진행하므로 마지막 인덱스틑 n-3이 되어야 n-3,n-2,n-1을 변환해서 

인덱스 오류가 나지 않는다 

 

-1을 출력하는 것은 변환을 마쳤는데도 다른 지점이 있으면 True값 저장해서 -1 출력하면 되고

else에 대해서는 count를 출력하면 된다 

 

 

-정답 풀이 

n,m=map(int,input().split())
A,B = [], []
count=0
for _ in range(n):
    A.append(list(map(int,input())))
for _ in range(n):
    B.append(list(map(int,input())))             

def convert3x3(x,y,A):
    for i in range(x,x+3):
        for j in range(y,y+3):
            if A[i][j]==1:
                A[i][j]=0
            else:
                A[i][j]=1

#convert3x3이 3단위라서 n-3이 제일 마지막이 되어야한다(n-3,n-2,n-1)
#안 그럼 인덱스 오류남              
for a in range(n-2):
    for b in range(m-2):
        if A[a][b] != B[a][b]:
            convert3x3(a,b,A)             
            count+=1
            
isTrue = False
for i in range(n):
    for j in range(m):
        if A[i][j] != B[i][j]:
            isTrue=True
                                                
if isTrue:
    print(-1)
else:
    print(count)

+ Recent posts