Algorithm Problems

[백준][Python] 1780번 종이의개수 - 재귀(분할정복)

WakaraNai 2021. 8. 29. 13:24
728x90
반응형

 

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

 

1780번: 종이의 개수

N×N크기의 행렬로 표현되는 종이가 있다. 종이의 각 칸에는 -1, 0, 1의 세 값 중 하나가 저장되어 있다. 우리는 이 행렬을 적절한 크기로 자르려고 하는데, 이때 다음의 규칙에 따라 자르려고 한다.

www.acmicpc.net

 

Python - 코드 정리 후

import sys
input = sys.stdin.readline



n = int(input())
arr = [list(map(int,input().split())) for _ in range(n)]

def recur(r,c,size):
    global arr
    
    if size<=1:
        return [arr[r][c]]

    size //= 3
    ans = []

    for i in range(3):
        for j in range(3):
            ans += recur(r+size*i, c+size*j,size)

    for x in ans:
      if x != ans[0]:
         return ans           
    return [ans[0]]

ans = recur(0,0,n)
result = [0,0,0]
for a in list(map(int,ans)):
    result[a] += 1
print(result[2])
print(result[0])
print(result[1])

Python - 코드 정리 전

import sys
input = sys.stdin.readline



n = int(input())
arr = [list(map(int,input().split())) for _ in range(n)]

for i in range(n):
    for j in range(n):
        if arr[i][j]==-1:
            arr[i][j] = 2

def recur(r,c,size):
    global arr
    ans = str(arr[r][c])
    
    if size<=1:
        return ans

    for i in range(size):
        for j in range(size):
            if ans != arr[r+i][c+j]:
                
                size //= 3
                ans = ""
                ans += recur(r, c, size)
                ans += recur(r+size, c, size)
                ans += recur(r+size*2, c, size)
                ans += recur(r, c+size, size)
                ans += recur(r+size, c+size, size)
                ans += recur(r+size*2, c+size, size)
                ans += recur(r, c+size*2, size)
                ans += recur(r+size, c+size*2, size)
                ans += recur(r+size*2, c+size*2, size)

                for x in ans:
                    if x != ans[0]:
                        return ans           
                return ans[0]
    return ans

ans = recur(0,0,n)
result = [0,0,0]
for a in list(map(int,list(ans))):
    result[a] += 1
    
print(result[2])
print(result[0])
print(result[1])

 

 

+) 재귀의 분할 정복은 

Sol1) 분할을 해야하는가 체크 + 모든 등분에 대해 몰아서 재귀 실행 

Sol2) 모든 등분에 대해 몰아서 재귀 실행 + 합칠 수 있는가

728x90
반응형