ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • [BOJ-1780] 종이의 개수 Python
    Algorithm 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하게된다.

     

    'Algorithm' 카테고리의 다른 글

    DP 동적 계획법  (0) 2020.07.02
Designed by Tistory.