티스토리 뷰

알고리즘

백준 1080 - 파이썬

취뽀가자!! 2023. 8. 6. 20:59

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

 

1080번: 행렬

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

www.acmicpc.net

문제 풀이

문제를 읽자마자 한번에 이해도 못했고, 어떻게 풀어야 할지 감도 안 잡혀 다른 사람들의 풀이를 찾아봤다. 문제에 대한 이해는 이 블로그를 참고했다.

 

이 문제를 풀면서 생각해야 할 점은 다음과 같다.

 

1. 뒤집을 수 있는 크기는 3x3이다.

2. 1번 조건 때문에 끝에 있는 두 블럭은 뒤집기가 불가능하다.

 

위 경우를 코드로 어떻게 구현했는지는 주석으로 설명해 보겠다.

 

코드

import sys
input = sys.stdin.readline

n,m = map(int, input().split())
graph1 = []
graph2 = []
cnt = 0

for _ in range(n):
  graph1.append(list(map(int,input().rstrip())))

for _ in range(n):
  graph2.append(list(map(int,input().rstrip())))

def convertGraph(i,j): 
  # 인덱스의 위치부터 +2만큼 변환해줌 
  # (3x3 단위로 변경 가능하다는 조건 때문)
  for x in range(i,i+3):
    for y in range(j, j+3):
      graph1[x][y] = 1 - graph1[x][y]

# graph1과 graph2의 값이 같지 않은 인덱스의 위치를 convertGraph에 전달
# n-2, m-2까지만 반복문 돌도록 해둔 이유는 행렬 변환시 3x3 크기의 행렬 값이 한번에 바뀌기 때문
for i in range(n-2):
  for j in range(m-2):
    if graph1[i][j] != graph2[i][j]:
      convertGraph(i,j)
      cnt += 1

# flag = 0
# for i in range(n):
#   for j in range(m):
#     if graph1[i][j] != graph2[i][j]:
#       flag = 1
#       break

# if flag == 1:
#   print(-1)
# else:
#   print(cnt)

print(-1) if graph1 != graph2 else print(cnt)

 

느낀점

확실히 꾸준히 풀어야 감도 안 잃을수 있음을 다시 한번 깨닫는 문제이다. 요즘 관심있던 경제 공부도 하고 운동도 하느라 문제 풀 시간이 부족했다. 화요일부터 휴가이기도 하고 휴가 끝나고도 경제 관련 자격증을 공부하느라 새로운 문제를 매일 풀지는 못하겠지만 ,이때까지 풀었던 문제의 복습 정도는 꾸준히 해야 되겠다.

'알고리즘' 카테고리의 다른 글

백준 11718 - 파이썬  (0) 2023.09.16
백준 3109 - 파이썬  (1) 2023.09.11
백준 1213 - 파이썬  (0) 2023.07.29
백준 1744 - 파이썬  (0) 2023.07.21
백준 13459 - 파이썬  (0) 2023.07.11
댓글
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
«   2025/02   »
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
글 보관함