티스토리 뷰

Algorithm/Greedy

(Python) - BOJ(1080번) : 행렬

하눤석 2022. 1. 25. 15:34
728x90

https://www.acmicpc.net/problem/1080

 

1080번: 행렬

첫째 줄에 행렬의 크기 N M이 주어진다. N과 M은 50보다 작거나 같은 자연수이다. 둘째 줄부터 N개의 줄에는 행렬 A가 주어지고, 그 다음줄부터 N개의 줄에는 행렬 B가 주어진다.

www.acmicpc.net


  • 해설 : 

0과 1로만 이루어진 행렬 A와 B가 주어질 때 A를 B로 변환시키기 위해 A를 몇 번 뒤집어야 하는지 찾는 문제이다.

A를 뒤집는다는 것은, A의 3x3 만큼의 크기를 뒤집는다는 것이다, (1이면 0으로, 0이면 1로)

 

 

 


  • 풀이 :

A의 (0,0)부터 (N-2,N-2) 까지 탐색하며 B와 다른 원소를 만난다면 3x3만큼 뒤집어주면 된다., 

즉, 현재 내 위치의 값만 비교하여 다르다면 뒤집어주는 방법이므로 그리디에 사용했다고 볼 수 있다.

 

 

 


  • 소스코드 : 

 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
import sys
input = sys.stdin.readline
 
if __name__ == "__main__":
    N,M = map(int,input().split())
    A = [list(map(int,input().strip())) for _ in range(N)]
    B = [list(map(int,input().strip())) for _ in range(N)]
    ans = 0
    for i in range(N-2):
        for j in range(M-2):
            if A[i][j] != B[i][j]:
                for x in range(i,i+3):
                   for y in range(j,j+3):
                       A[x][y] = abs(A[x][y]-1)
                ans += 1
    for i in range(N):
        for j in range(M):
            if A[i][j] != B[i][j]:
                print(-1)
                exit()
    print(ans)
cs
320x100
댓글
© 2022 WonSeok, All rights reserved