본문 바로가기
코딩테스트

백준(Baekjoon) 1080번 : 행렬 with Python

by CleanCoder 2021. 1. 22.

백준에서 문제 보기 : https://www.acmicpc.net/problem/1080

 

1080번: 행렬

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

www.acmicpc.net

 

난이도

실버 2

알고리즘

1) N M 행렬 두개 입력 받기

2) 두개의 행렬의 원소가 같지 않을때 3X3 의 값을 바꿔줌 (이를 0부터 N-2 , M-2 번 돌림 3X3행렬생각하면 나옴) , cnt로 도는거 세줌 

3) 두 행렬 원소 하나씩 비교해가면서 같으면 cnt 출력 틀리면 -1 출력

 

해결 방안

문제에서 요구하는 사항은 '그리디'를 구현하여 해결하는 개념을 요구합니다.

 


N,M = map(int, input().split()) 

matrix = [list(map(int, input())) for _ in range(N)]
result = [list(map(int, input())) for _ in range(N)] 

cnt = 0

def solve(x, y, matrix):
  for i in range(x, x+3): 
    for j in range(y, y+3):
      matrix[i][j] = 1 - matrix[i][j]

for i in range(0, N-2): 
  for j in range(0, M-2): 
    if matrix[i][j] != result[i][j]: 
      cnt += 1
      solve(i,j,matrix)

ck = True
for i in range(N):
  for j in range(M):
    if matrix[i][j] != result[i][j]:
      ck = False

if ck: 
  print(cnt) 
else: 
  print(-1)

 

출력

댓글