1080. 행렬
1080번: 행렬
첫째 줄에 행렬의 크기 N M이 주어진다. N과 M은 50보다 작거나 같은 자연수이다. 둘째 줄부터 N개의 줄에는 행렬 A가 주어지고, 그 다음줄부터 N개의 줄에는 행렬 B가 주어진다.
www.acmicpc.net
- 풀이
- (0,0)은 (1,1)을 가운데로 낀 3x3 블럭이 아니면 아무도 값을 바꿀 수가 없다
- (0,1)은 (1,2)을 가운데로 낀 3x3 블럭이 아니면 아무도 값을 바꿀 수가 없다
- → 이런식으로 앞의 값들은 그 블럭이 지나고나면 손을 댈수가 없기 때문에 무조건 그 블록에서 바꿔야하는 것!
- 해당 칸의 값이 목표 그래프와 다르다면 그 블럭은 블럭을 바꾸는 선택밖에 할 수가 없음
- 해당 칸의 값이 목표 그래프와 같다면 그 블럭은 블럭을 바꾸지 않는 선택밖에 할 수가 없음
- → 그 위치에서 최선의 선택 (바꾼다 / 안바꾼다)
- → 그리디
- 각각의 위치에서 최선을 다하고 끝냈는데 확인해보니 다르다? → 다른 방법이 없는 것이니까 -1
def change(x, y):
for i in range(3):
for j in range(3):
if graphA[x+i][y+j] == 0:
graphA[x+i][y+j] = 1
elif graphA[x+i][y+j] == 1:
graphA[x+i][y+j] = 0
return
n, m = map(int, input().split())
graphA = []
graphB = []
for i in range(n):
graphA.append(list(map(int, input().rstrip())))
for i in range(n):
graphB.append(list(map(int, input().rstrip())))
cnt = 0
for i in range(1, n-1):
for j in range(1, m-1):
if graphA[i-1][j-1] != graphB[i-1][j-1]:
cnt += 1
change(i-1, j-1)
for a, b in zip(graphA, graphB):
if a != b:
print(-1)
exit()
print(cnt)
'코딩테스트 > BOJ' 카테고리의 다른 글
| [백준][부분합] 2632. 피자판매 (0) | 2024.01.09 |
|---|---|
| [백준][DP] 2156. 포도주 시식 (1) | 2024.01.05 |
| [그리디] 2864. 5와 6의 차이 (0) | 2024.01.04 |
| [백준] [DP] 1947. 선물 전달 (2) | 2024.01.03 |
| [백준] [DP] 2229. 조 짜기 (0) | 2024.01.01 |