-문제: 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)
'백준 > Greedy' 카테고리의 다른 글
[코딩테스트] 백준 1449번: 수리공 항승 (0) | 2022.01.29 |
---|---|
[코딩테스트] 백준 2437번: 저울 (0) | 2022.01.27 |
[코딩테스트] 백준 2864번: 5와 6의 차이 (0) | 2022.01.26 |
[코딩테스트] 백준 1049번: 기타줄 (0) | 2022.01.26 |
[코딩테스트] 백준 1953번: A->B (0) | 2022.01.25 |