https://www.acmicpc.net/problem/1080
1080번: 행렬
첫째 줄에 행렬의 크기 N M이 주어진다. N과 M은 50보다 작거나 같은 자연수이다. 둘째 줄부터 N개의 줄에는 행렬 A가 주어지고, 그 다음줄부터 N개의 줄에는 행렬 B가 주어진다.
www.acmicpc.net
문제
2개의 행렬이 같아질 수 있게 첫번째 행렬의 임의의 3x3 구역을 1 -> 0, 0 -> 1로 바꿔주어 같게만들어주는것이 목표다.
임의의 3x3 구역을 바꿔주는것을 연산이라 한다.
입력
첫번째 줄 => N: 행렬의 세로 길이, M: 행렬의 가로 길이
두번째 줄 => 세로 길이가 N이고 가로길이가 M인 2개의 행렬들이 주어진다.
출력
두 행렬이 같다면 사용된 연산의 최솟값 출력
두 행렬이 같지않다면 -1 출력
풀이
두개의 행렬을 두개의 이차원 리스트로 받아준 뒤,
행렬의 값이 다른 위치를 찾아내어 그 위치를 기준으로 연산을 실시한다. 만일 연산 실시 이후에는 cnt에 1씩 더해준다.
마지막에 두 행렬을 비교하여 같다면 cnt 출력, 같지않다면 -1 을 출력해준다.
# 1080번 행렬
# 여기서 연산은 임의의 3X3구역을 0->1 1->0으로 바꾸는 작업을 뜻한다. N = 세로 M = 가로
N, M = map(int, input().split())
first = [list(map(int, input())) for _ in range(N)]
second = [list(map(int, input())) for _ in range(N)]
def change(x, y):
for i in range(x, x+3):
for j in range(y, y+3):
first[j][i] = 1 - first[j][i]
def check():
for y in range(N):
for x in range(M):
if first[y][x] != second[y][x]:
return False
return True
# 연산의 개수를 담는 변수
cnt = 0
# change를 위해 범위를 N-2, M-2로 설정
for y in range(N-2):
for x in range(M-2):
if first[y][x] != second[y][x]:
change(x, y)
cnt += 1
if check():
print(cnt)
else:
print(-1)
출력값
'백준 > 그리디' 카테고리의 다른 글
[백준] 2869번 최대공약수와 최소공배수 - 파이썬 (0) | 2022.02.05 |
---|---|
[백준] 1700번 멀티탭 스케줄링 - 파이썬 (0) | 2022.02.04 |
[백준] 1969번 DNA - 파이썬 (0) | 2022.02.03 |
[백준] 1946번 신입 사원 - 파이썬 (0) | 2022.02.02 |
[백준] 11399번 ATM - 파이썬 (0) | 2022.02.02 |