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

어떻게 접근해야할지 몰랐던 문제. 이 문제로 공부하자!

 

-정답풀이:

n,m=map(int,input().split())
cnt=0

change_maps=[list(map(int,input()))for _ in range(n)]
result_maps=[list(map(int,input()))for _ in range(n)]

def convert3x3(x,y,arr):
    for i in range(x,x+3):
        for j in range(y,y+3):
            change_maps[i][j]=1-change_maps[i][j]
            
for i in range(0,n-2):
    for j in range(m-2):
        if change_maps[i][j] != result_maps[i][j]:
            convert3x3(i,j,change_maps)
            cnt+=1
            
nonResult=False
for i in range(0,n):
    for j in range(0,m):
        if change_maps[i][j] != result_maps[i][j]:
            nonResult=True
if nonResult:
    print(-1)
else:
    print(cnt)

-정답 이해

 

 

처음에 3x3 행렬만 변환이 가능하다길래 어떻게 해야하나 몰랐는데 위 풀이처럼 하면 된다

행,열 값을 받고, 변환시킬 행렬을 받는다. 그리고 모든 값이 0,1이므로 0은 1-0=1이 되고, 1은 1-1=0이 되므로 

1-change_maps[i][j]로 하면 0,1을 모두 변환시킬 수 있다

 

 

 

반복문 인덱스가 왜 n-2인가 했는데 이게 실질적으로는  n-3 인덱스까지 진행하는데 15번에 convert3x3을 해야한다.

convert3x3이 x 부터 x+2 인덱스까지 진행하므로 그것을 고려해서 인덱스를 설정한 것 같다(인덱스가 n-3일 때, convert3x3은 n-3부터 n-1(끝 인덱스)까지 진행된다)

 

 

변환 전 행렬과 변환후 행렬의 값이 다른 경우에 True를 대입한다. 만약 두 행렬이 모두 같다면 nonResult의 값은 False가 될 것이다 

 

변환전 행렬과 변한후 행렬이 다르다면 nonResult의 값은 True일 것이고, 그 경우에 -1을 출력한다. 

nonResult의 값이 False라면 행렬 변환에 성공한 것이므로, 변환횟수를 출력한다 

23번 해석 -> if True: print(-1) 

+ Recent posts