728x90
반응형
문제:
0과 1로만 이루어진 행렬 A와 행렬 B가 있다. 이때, 행렬 A를 행렬 B로 바꾸는데 필요한 연산의 횟수의 최솟값을 구하는 프로그램을 작성하시오.
행렬을 변환하는 연산은 어떤 3*3크기의 부분 행렬에 있는 모든 원소를 뒤집는 것이다. (0 -> 1,1 -> 0)
입력:
첫째 줄에 행렬의 크기 N M이 주어진다. N과 M은 50보다 작거나 같은 자연수이다. 둘째 줄부터 N개의 줄에는 행렬 A가 주어지고, 그 다음줄부터 N개의 줄에는 행렬 B가 주어진다.
출력:
첫째 줄에 문제의 정답을 출력한다. 만약 A를 B로 바꿀 수 없다면 -1을 출력한다.
풀이방법:
그리디 방법이므로 현재 위치하고 있는 곳에서 A와 B를 비교해서 뒤집을지 결정해주면 된다. 왼쪽 위부터 오른쪽으로 한칸씩 미끄러져 가며 비교를 하고 맨 윗줄을 다 비교하면 그 아랫줄로 내려가서 비교를 해주도록 한다. 이렇게 하면 한 번 그 위치를 기준으로 뒤집은 경우에는 다시 그 칸을 뒤집진 않기 때문에 한 번 뒤집었던 부분을 다시 뒤집을 수 있다는 걱정을 할 필요 없다. 따라서 이렇게 행렬A를 탐색하며 다 뒤집은 다음에 행렬 B와 비교해서 일치한다면 연산의 최솟값을 출력하고 그렇지 않다면 -1을 출력하도록 하였다.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
|
def change(x,y,A):
for i in range(3):
for j in range(3):
if A[x+i][y+j]==0:
A[x+i][y+j]=1
else:
A[x+i][y+j]=0
return A
n,m = map(int,input().split())
A=[]
B=[]
for i in range(n):
A.append(list(map(int,list(input()))))
for i in range(n):
B.append(list(map(int,list(input()))))
count=0
for i in range(n-3+1):
for j in range(m-3+1):
if A[i][j]!=B[i][j]:
A=change(i,j,A)
count+=1
answer=True
for i in range(n):
for j in range(m):
if A[i][j]!=B[i][j]:
answer=False
if answer:
print(count)
else:
print(-1)
|
cs |
문제 링크:
728x90
반응형
'Algorithm > Python' 카테고리의 다른 글
[BOJ]2022. 사다리 (0) | 2019.09.21 |
---|---|
[BOJ]1561. 놀이공원 (0) | 2019.09.20 |
[BOJ]10610. 30 (0) | 2019.09.18 |
[BOJ]2875. 대회 or 인턴 (0) | 2019.09.17 |
[BOJ]1744. 수 묶기 (0) | 2019.09.16 |