평범한 필기장

[BOJ_Python] 1080_행렬 본문

코딩 테스트 준비/BOJ

[BOJ_Python] 1080_행렬

junseok-rh 2023. 3. 23. 14:22

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

 

1080번: 행렬

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

www.acmicpc.net

내가 생각한 아이디어

 나는 이 문제를 너무 복잡하게 생각해서 자꾸 3번째 테스트 케이스에서 -1이 출력되었다. 기본적으로 틀린 부분을 기준으로 3*3 행렬부분을 바꿔야겠다는 생각은 했지만 그것을 적용하는 부분에서 내가 잘못 생각한 것 같다. 나는 3*3행렬에서 중심이 될 수 있는 점들을 골라내고 그 중심들을 모두 탐색해서 중심을 중심으로 3*3행렬 부분에서 틀린 부분이 있으면 그 행렬을 전부 바꿔야겠다는 이상한?? 생각을 해버렸다;; 결국 복잡한 테스트 케이스에선 정답이 나오지 않았다ㅜㅜ

 

정답 코드

import sys

n, m = map(int, input().split())
A = []
B = []
for _ in range(n):
    A.append(list(map(int, sys.stdin.readline().rstrip())))

for _ in range(n):
    B.append(list(map(int, sys.stdin.readline().rstrip())))

def change(a, b):
    for i in range(a, a+3):
        for j in range(b, b+3):
            if A[i][j] == 1:
                A[i][j] = 0
            else:
                A[i][j] = 1

cnt = 0
for i in range(n-2):
    for j in range(m-2):
        if A[i][j] != B[i][j]:
            change(i, j)
            cnt += 1

        if A == B:
            break
    if A == B:
        break

if A == B:
    print(cnt)
else:
    print(-1)

내가 간과한 것

  1.  input matrix의 크기가 3*3 보다 작은 경우를 굳이 따로 생각 할 필요가 없었다. ( range함수에 음수가 들어가면 반복문이 아예 안돌아가서 탐색을 안함!!)
  2. 3*3행렬의 중앙을 생각해서 복잡하게 따질 필요가 없었다. (모든 지점을 탐색하는 대신 n-3째 행, m-3 열까지로 범위를 지정하면 탐색이 편함!!)

 

'코딩 테스트 준비 > BOJ' 카테고리의 다른 글

[BOJ_Python] 17626_Four Squares  (0) 2023.03.26
[BOJ_Python] 16206_롤케이크  (0) 2023.03.24
[BOJ_Python] 21314_민겸 수  (0) 2023.03.22
[BOJ_Python] 20300_서강근육맨  (0) 2023.03.21
[BOJ_Python] 11508_2+1 세일  (0) 2023.03.19