[ BOJ / Python ] 4779번 칸토어 집합

황승환·2022년 2월 20일
0

Python

목록 보기
191/498


이번 문제는 분할정복을 통해 해결할 수 있는 문제였다. 우선 문제를 보자마자 재귀 함수를 사용해야겠다는 생각을 했다. 왼쪽과 오른쪽에 대한 재귀 호출이 계속 이뤄져야 하는 것으로 보였다. 분할정복은 이렇게 일정한 부분으로 나눠서 따로 따로 처리하는 방식이다. 전체 길이에 대하여 왼쪽, 오른쪽 인덱스를 구하고 그 인덱스에 대하여 재귀호출 하는 방식으로 해결했다.

  • 분할정복에 사용할 함수 recursion을 arr, start, cur_l을 인자로 갖도록 선언한다.
    -> tmp에 cur_l//3을 저장한다.
    -> tmp가 0일 경우, 함수를 종료한다.
    -> start+tmp부터 start+tmp*2까지 반복하는 i에 대한 for문을 돌린다.
    --> arr[i]를 ' '으로 갱신한다.
    -> recursion(arr, start, tmp)를 재귀호출한다. (왼쪽에 해당)
    -> recursion(arr, start+tmp*2, tmp)를 재귀호출한다. (오른쪽에 해당)
  • 계속 반복하는 while문을 돌린다.
    -> try문을 선언한다.
    --> n을 입력받는다.
    --> 만약 n이 공백일 경우 while문을 탈출한다.
    --> 리스트 arr을 '-' 3의 n제곱개로 채운다.
    --> recursion(arr, 0, 3**n)을 호출한다.
    --> 정답을 저장할 변수 answer에 arr을 문자열로 변환하여 저장한다.
    --> answer를 출력한다.
    -> EOFError가 발생할 경우 while문을 종료한다.

Code

def recursion(arr, start, cur_l):
    tmp=cur_l//3
    if tmp==0:
        return
    for i in range(start+tmp, start+tmp*2):
        arr[i]=' '
    recursion(arr, start, tmp)
    recursion(arr, start+tmp*2, tmp)
while True:
    try:
        n=int(input())
        if n=='':
            break
        arr=['-' for _ in range(3**n)]
        recursion(arr, 0, 3**n)
        answer=''.join(arr)
        print(answer)
    except EOFError:
        break

profile
꾸준함을 꿈꾸는 SW 전공 학부생의 개발 일기

0개의 댓글