

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)은 오른쪽 선이 된다.
이렇게 선언적으로 프로그래밍을 해주면 원하는 해답이 나온다.
재귀함수로 접근을 할 때는 너무 많은 생각을 하고 풀면 안 되는 것 같다. 어떻게 하는지는 컴퓨터가 알아서 해결해 주고, 우리가 그 과정까지 분석할 필요는 없는 것이다. 그렇기에 일단 종료조건과 필요한 조건들을 분석하고, 분석한 것들을 선언해주면 되는 것 같다.
| [파이썬/python] 백준 1436번 : 영화감독 숌 (🥈5) (0) | 2023.06.11 |
|---|---|
| [파이썬/python] 백준 28224번 : Final Price (🥉4) (0) | 2023.06.10 |
| [파이썬/python] 백준 1541번 : 잃어버린 괄호 (🥈2) (0) | 2023.06.04 |
| [파이썬/python] 백준 25501번 : 재귀의 귀재 (🥉2) (0) | 2023.06.03 |
| [파이썬/python] 백준 28135번 : Since 1973 (🥉3) (0) | 2023.06.02 |