코딩테스트/BOJ

[백준] [그리디] 1080. 행렬 📍

박소민 2024. 1. 5. 16:49
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