문제
1780번: 종이의 개수
N×N크기의 행렬로 표현되는 종이가 있다. 종이의 각 칸에는 -1, 0, 1의 세 값 중 하나가 저장되어 있다. 우리는 이 행렬을 적절한 크기로 자르려고 하는데, 이때 다음의 규칙에 따라 자르려고 한다.
www.acmicpc.net
풀이
DFS로 풀이했다.
각 종이를 검사하며 종이가 같은 수로 되어있는지 여부를 확인하고, 만약 그렇지 않다면 9개의 크기로 자르고 다시 해당 종이의 첫번째 지점에서 탐색을 시작한다.
코드
import sys
sys.setrecursionlimit(10**9)
dy = [0, 0, 0, 1, 1, 1, 2, 2, 2]
dx = [0, 1, 2, 0, 1, 2, 0, 1, 2]
def dfs(y, x, k):
_init = p[y][x]
if k == 1:
result[_init] += 1
return
for i in range(y, y+k):
for j in range(x, x+k):
if p[i][j] != _init:
for i in range(9):
s = k//3
ny = y + s*dy[i]
nx = x + s*dx[i]
dfs(ny, nx, s)
return
result[_init] += 1
n = int(sys.stdin.readline().strip())
p = []
result = {-1: 0, 0: 0, 1: 0}
for _ in range(n):
_input = [int(x) for x in sys.stdin.readline().split()]
p.append(_input)
dfs(0, 0, n)
for i in range(-1, 2):
print(result[i])
'CS > 알고리즘 문제 풀이' 카테고리의 다른 글
[백준] 2447 - 별 찍기 - 10 [Python(파이썬)] (1) | 2021.01.26 |
---|---|
[백준] 2468 - 안전 영역 [Python(파이썬)] (0) | 2021.01.23 |
[백준] 11279 - 최대힙 [Python(파이썬)] (0) | 2021.01.23 |
[백준] 10819 - 차이를 최대로 [Python(파이썬)] (0) | 2021.01.23 |
[백준] 1929 - 소수구하기 [Python(파이썬)] (0) | 2021.01.23 |