[파이썬/python] 백준 4779번 : 칸토어 집합 (🥈3)

 

https://www.youtube.com/watch?v=uSSC0aKXbWQ&list=LL&index=8 

 

재귀함수에 접근하는 게 어렵게 느껴져서, 일단 위의 유튜브 강의를 보고 공부를 했다.

그리고 무작정 혼자 푸는 것보단 일단 다른 사람들의 코드를 보고 어떤 식으로 푸는지 감을 익혀햐 할 것 같아서 대강 어떤 식으로 푸는지 추측만 하고 다른 분들의 코드를 보았다.

 

중요한 것은 위에 나와있는 디클래러티브 프로그래밍 감각인 것 같다.

그러니까 이 문제를 해석해보면 3 ** n개의 '-'로 이루어진 문자열을 계속 3등분하여 그 가운데를 공백으로 만들어 주는 것이다. 1개의 선을 3등분하여 가운데를 공백을 만들면 2개의 선이 생기고 2개의 선도 각각 3등분 하여 또 공백을 만들고 이 과정을 n번 만큼 반복하는 것이다.

이것을 선언적으로 재귀함수로 코드를 짜야한다

def cantor(a,n):
    if n == 1:
        return
    for i in range(a + n//3, a + (n//3) * 2):
        answer[i] = " "
    cantor(a, n//3)
    cantor(a + n//3 * 2, n//3)
    
while True:
    try:
        n = int(input())
        answer = ["-"] * (3 ** n)
        cantor(0, 3 ** n)
        print("".join(answer))
    except:
        break

입력값에 제한이 없기 때문에 try except문을 이용해 주어야 한다.

 

for 문의 범위를 a + n//3, a + (n//3) * 2로 지정해준다. 선을 3등분했을 때의 가운데의 인덱스범위이다.  해당하는 인덱스를 전부 공백으로 바꿔준다.

그리고 왼쪽 선과 오른쪽 선을 나워준다.

cantor(a, n//3)는 왼쪽 선,
cantor(a + n//3 * 2, n//3)은 오른쪽 선이 된다.

이렇게 선언적으로 프로그래밍을 해주면 원하는 해답이 나온다.

 

재귀함수로 접근을 할 때는 너무 많은 생각을 하고 풀면 안 되는 것 같다. 어떻게 하는지는 컴퓨터가 알아서 해결해 주고, 우리가 그 과정까지 분석할 필요는 없는 것이다. 그렇기에 일단 종료조건과 필요한 조건들을 분석하고, 분석한 것들을 선언해주면 되는 것 같다.

comment