티스토리 뷰
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 |
댓글