https://www.acmicpc.net/problem/1780
1780번: 종이의 개수
N×N크기의 행렬로 표현되는 종이가 있다. 종이의 각 칸에는 -1, 0, 1 중 하나가 저장되어 있다. 우리는 이 행렬을 다음과 같은 규칙에 따라 적절한 크기로 자르려고 한다. 만약 종이가 모두 같은 수
www.acmicpc.net
문제 접근
분할정복 문제다.
다른 분할탐색 실버문제는 4개로 나눴지만 이문제에선 9개로 나눈다.
재귀를 활용해서 9번 쪼개면 끝
코드
import sys
input = sys.stdin.readline
"""
분할정복
size//3을 0번, 1번, 2번 더하는걸 반복하면서 9개로 쪼개기.
"""
minus = 0
zero = 0
plus = 0
def rec(x, y, size):
num = arr[x][y]
for i in range(x, x+size):
for j in range(y, y+size):
if num != arr[i][j]:
#9개로 쪼개기
rec(x, y, size//3)
rec(x, y + size//3, size//3)
rec(x, y + (size//3*2), size//3)
rec(x + size//3, y,size//3)
rec(x + size//3,y + size//3, size//3)
rec(x + size//3,y + (size//3*2), size//3)
rec(x + (size//3*2), y ,size//3)
rec(x + (size//3*2), y + size//3, size//3)
rec(x + (size//3*2), y + (size//3*2), size//3)
return
if num == -1:
global minus
minus += 1
elif num == 0:
global zero
zero += 1
else:
global plus
plus += 1
N = int(input())
arr = [list(map(int,input().split())) for _ in range(N)]
rec(0, 0, N)
print(minus, zero, plus, end="\n")
69424KB 4472ms
'백준 > 문제풀이_python' 카테고리의 다른 글
1916 최소비용 구하기 (0) | 2023.01.07 |
---|---|
1753 최단경로 python (0) | 2023.01.07 |
1992 쿼드트리 python (0) | 2023.01.04 |
2630 색종이 만들기 (0) | 2023.01.04 |
9375 패션왕 신해빈 python (0) | 2022.12.19 |
댓글