-
[백준] 1080 - 행렬알고리즘 2023. 5. 8. 16:50728x90
1. 문제
https://www.acmicpc.net/problem/1080
1080번: 행렬
첫째 줄에 행렬의 크기 N M이 주어진다. N과 M은 50보다 작거나 같은 자연수이다. 둘째 줄부터 N개의 줄에는 행렬 A가 주어지고, 그 다음줄부터 N개의 줄에는 행렬 B가 주어진다.
www.acmicpc.net
2. 접근
1. 3 X 3의 행렬을 뒤집는다는것을 생각해서 overturn 함수의 3칸을 어떻게 처리할지를 많이 고민했다 ( 근데 간단하게 range를 (x,x+3) 이렇게 표현하면 된다...) ,, 처음에는 3X3처리에 대해서 막상 생각이 나지 않았었다
2. n<3, m<3 인 경우에는 뒤집을 수 가 없어서 무조건 -1을 출력한다고 착각할 수 있다. 여기서 n<3, m<3 일때, a_matrix == b_matrix 라면, -1이 아닌 0이 출력 되어야 한다는것을 생각하자
3. 2차 반복문을 돌리면서 특정 지점이 a_matrix[i][j] != b_matrix [i][j] 라면 뒤집어 주는 함수를 실행하고 cnt를 증가 시키자
4. n<3, m<3 외에도 a_matrix == b_matrix 을 만들 수 없는 경우는 -1을 출력하도록 해주자 ( 34번 라인 )
3. 풀이
import sys input = sys.stdin.readline n,m = map(int,input().split()) a_matrix = [] for i in range(n): a_matrix.append(list(map(int,input().rstrip()))) b_matrix = [] for i in range(n): b_matrix.append(list(map(int,input().rstrip()))) def overturn(x,y): for i in range(x,x+3): for j in range(y,y+3): if a_matrix[i][j] == 0: a_matrix[i][j] = 1 else: a_matrix[i][j] = 0 cnt = 0 # n<3,m<3 인데 a_matrix,b_matrix 가 같으면 cnt는 -1 이 아니니까 a_matrix != b_matrix 조건 필요 if (n < 3 or m < 3) and a_matrix != b_matrix: cnt = -1 else: for i in range(n-2): # 0 부터 범위 시작이니까 -2가 맞다 for j in range(m-2): if a_matrix[i][j] != b_matrix[i][j]: overturn(i,j) cnt += 1 if cnt != -1: if a_matrix != b_matrix: cnt = -1 print(cnt)
'알고리즘' 카테고리의 다른 글
[백준] 1325 - 효율적인 해킹 (1) 2023.05.08 [백준] 1051 - 숫자 정사각형 (0) 2023.05.08 [백준] 1049 - 기타줄 (0) 2023.04.20 [백준] 1389 - 케빈 베이컨의 6단계 법칙 (0) 2023.04.14 [백준] 2417 - 정수 제곱근 (0) 2023.04.09