반응형
백준 1080 행렬
문제
0과 1로만 이루어진 행렬 A와 행렬 B가 있다. 이때, 행렬 A를 행렬 B로 바꾸는데 필요한 연산의 횟수의 최솟값을 구하는 프로그램을 작성하시오.
행렬을 변환하는 연산은 어떤 3*3크기의 부분 행렬에 있는 모든 원소를 뒤집는 것이다. (0 -> 1, 1 -> 0)
입력
첫째 줄에 행렬의 크기 N M이 주어진다. N과 M은 50보다 작거나 같은 자연수이다. 둘째 줄부터 N개의 줄에는 행렬 A가 주어지고, 그 다음줄부터 N개의 줄에는 행렬 B가 주어진다.
출력
첫째 줄에 문제의 정답을 출력한다. 만약 A를 B로 바꿀 수 없다면 -1을 출력한다.
여기서 뽀인트는 3*3 크기 단위로 모든 원소를 반대로 뒤집는다는 것 ! 그래서 각각의 배열들을 비교했을 때 전체를 비교할 필요가 없이 3*3크기로 비교하면 된다. (아래 for문에서 a-2, b-2 부분)
그리고 함수 convert 로 모든 요소를 뒤집고 마지막으로 각각의 배열의 전체 요소가 일치하는지 확인한다. 일치하지않으면 3*3으로 바꿔서 고칠 수 있는 것들이 아니기 때문에 -1 을 출력한다.
정답 코드
a,b = map(int,input().split())
count = 0
A = [list(map(int,input())) for _ in range(a)]
B = [list(map(int,input())) for _ in range(a)]
def convert(x,y,A):
for i in range(x,x+3):
for j in range(y,y+3):
A[i][j] = 1-A[i][j]
for i in range(a-2):
for j in range(b-2):
if A[i][j] != B[i][j]:
convert(i,j,A)
count +=1
flag = True
for i in range(a):
for j in range(b):
if A[i][j] != B[i][j]:
flag = False
break
print(count) if flag==True else print(-1)
오늘 복습하면서 다시 풀어보니 아래 최종적으로 비교하는 부분을 이렇게 바꿀 수 있었다. 그런데 속도는 4ms 더 느려졌다@
n,m = map(int, input().split())
A = [list(map(int,input())) for _ in range(n)]
B = [list(map(int,input())) for _ in range(n)]
def convert(x,y,A):
for i in range(x, x+3):
for j in range(y,y+3):
A[i][j] = 1 - A[i][j]
index=0
for i in range(n-2):
for j in range(m-2):
if A[i][j] !=B[i][j]:
index +=1
convert(i,j,A)
print(-1) if A != B else print(index)
반응형
'Python > Python 코딩테스트' 카테고리의 다른 글
[그리디 알고리즘4] 백준 1202 보석 도둑 파이썬 우선순위 큐 heapq (0) | 2021.07.15 |
---|---|
[그리디 알고리즘3] 백준 1439 뒤집기 파이썬 (4) | 2021.07.14 |
[ 그리디 알고리즘 1 ] 백준 1774 수 묶기 파이썬 (0) | 2021.07.14 |
[Python] 백준 1946번 이해하기 (0) | 2021.07.07 |
[Python] 탐욕법, Greedy 알고리즘 (0) | 2021.07.06 |
댓글