반응형
문제
칸토어 집합은 0과 1사이의 실수로 이루어진 집합으로, 구간 [0, 1]에서 시작해서 각 구간을 3등분하여 가운데 구간을 반복적으로 제외하는 방식으로 만든다.
전체 집합이 유한이라고 가정하고, 다음과 같은 과정을 통해서 칸토어 집합의 근사를 만들어보자.
1. -가 3N개 있는 문자열에서 시작한다.
2. 문자열을 3등분 한 뒤, 가운데 문자열을 공백으로 바꾼다. 이렇게 하면, 선(문자열) 2개가 남는다.
3. 이제 각 선(문자열)을 3등분 하고, 가운데 문자열을 공백으로 바꾼다. 이 과정은 모든 선의 길이가 1일때 까지 계속 한다.
예를 들어, N=3인 경우, 길이가 27인 문자열로 시작한다.
---------------------------
여기서 가운데 문자열을 공백으로 바꾼다.
--------- ---------
남은 두 선의 가운데 문자열을 공백으로 바꾼다.
--- --- --- ---
한번 더
- - - - - - - -
모든 선의 길이가 1이면 멈춘다. N이 주어졌을 때, 마지막 과정이 끝난 후 결과를 출력하는 프로그램을 작성하시오.
입력
입력을 여러 줄로 이루어져 있다. 각 줄에 N이 주어진다. 파일의 끝에서 입력을 멈춘다. N은 0보다 크거나 같고, 12보다 작거나 같은 정수이다.
출력
입력으로 주어진 N에 대해서, 해당하는 칸토어 집합의 근사를 출력한다.
예제 입력0
1 3 2 |
예제 출력-
- - - - - - - - - - - - - - |
풀이
성능을 고려하기 보단 재귀로 가능한 문제이므로 재귀로 해결했다.
문제에서 나온 것처럼 문자열을 제거하는 것 보다 반대로 쌓는 게 쉬울 것 같아서 반대로 코드를 작성했다.
입력의 줄 수가 주어지지 않으므로 sys 라이브러리의 read 함수를 이용하면 EOF 문제 없이 읽어들일 수 있다.
import sys
input = sys.stdin.read
def cal(str, n):
if n == 0:
print(str)
return
cal(str + " "*len(str) + str, n-1)
for i in input().split():
cal("-", int(i))
반응형
'알고리즘 연습 > 재귀' 카테고리의 다른 글
[🥉5 / 백준 27433 / 파이썬] 팩토리얼 2 (0) | 2023.06.26 |
---|---|
[🥈4 / 백준 24060 / 파이썬] 알고리즘 수업 - 병합 정렬 1 (2) | 2022.09.18 |
[🥉2 / 백준 25501 / 파이썬] 재귀의 귀재 (0) | 2022.09.11 |
[🥉3 / 백준 14491 / 파이썬] 9진수 (0) | 2022.03.25 |
[🥈5 / 백준 17478 / 파이썬] 재귀함수가 뭔가요? (0) | 2022.02.06 |