Algorithm

[BOJ-1780] 종이의 개수 Python

hadaney 2020. 7. 2. 18:03

cache.values():

# 파이썬의 재귀호출과 관련한 에러를 제어
import sys
sys.setrecursionlimit(100000)

#input_matrix=[[0, 0, 0, 1, 1, 1, -1, -1, -1], [0, 0, 0, 1, 1, 1, -1, -1, -1], [0, 0, 0, 1, 1, 1, -1, -1, -1], [1, 1, 1, 0, 0, 0, 0, 0, 0], [1, 1, 1, 0, 0, 0, 0, 0, 0], [1, 1, 1, 0, 0, 0, 0, 0, 0], [0, 1, -1, 0, 1, -1, 0, 1, -1], [0, -1, 1, 0, 1, -1, 0, 1, -1], [0, 1, -1, 1, 0, -1, 0, 1, -1]]
# 입력값 받기
_len = int(input())
input_matrix = [[]]*_len
for idx in range(_len):
    input_matrix[idx] = list(map(int, input().split(' ')))

# 초기값 설정
cache = {-1:0, 0:0, 1:0}

def sub_solution(i, j, n):
	# 1) 원소가 한개라면
    if n==1:
        cache[input_matrix[i][j]] += 1
        return
    
    # 2) 모든 원소가 같은지 확인
    flag = True
    for ii in range(i,i+n):
        for jj in range(j,j+n):
            if input_matrix[i][j] != input_matrix[ii][jj]:
                flag = False
                break
                
    # 3) 모든 원소가 다르면 9개의 sub matrix로 나누어 재귀호출
    if flag:
        cache[input_matrix[i][j]] += 1
        return
    else:        
        for jump_i in range(0,3):
            for jump_j in range(0,3):
                sub_solution(i+(n//3*jump_i), j+(n//3*jump_j), n//3)
    return
    
# 결과 확인
def solution():
    sub_solution(0,0,_len)
    for value in cache.values():
        print(value)

solution()

 

코드를 짜다가 두가지 흥미로운 사실을 발견했다.

 

1) 재귀호출

 파이썬은 재귀호출이 일정 수준을 넘어가면 에러가 발생되도록 설정되어 있다. 

 sys.setrecursionlimit(100000) 이를 통해 해결가능

 

2) return

 파이썬 함수에서 return하려는 값을 따로 명시(return X)하지 않고 return 으로 끝내게 되면 None을 return하게된다.