https://www.acmicpc.net/problem/4779
문제
칸토어 집합은 0과 1사이의 실수로 이루어진 집합으로, 구간 [0, 1]에서 시작해서 각 구간을 3등분하여 가운데 구간을 반복적으로 제외하는 방식으로 만든다.
전체 집합이 유한이라고 가정하고, 다음과 같은 과정을 통해서 칸토어 집합의 근사를 만들어보자.
1. -가 3N개 있는 문자열에서 시작한다.
2. 문자열을 3등분 한 뒤, 가운데 문자열을 공백으로 바꾼다. 이렇게 하면, 선(문자열) 2개가 남는다.
3. 이제 각 선(문자열)을 3등분 하고, 가운데 문자열을 공백으로 바꾼다. 이 과정은 모든 선의 길이가 1일때 까지 계속 한다.
예를 들어, N=3인 경우, 길이가 27인 문자열로 시작한다.
---------------------------
여기서 가운데 문자열을 공백으로 바꾼다.
--------- ---------
남은 두 선의 가운데 문자열을 공백으로 바꾼다.
--- --- --- ---
한번 더
- - - - - - - -
모든 선의 길이가 1이면 멈춘다. N이 주어졌을 때, 마지막 과정이 끝난 후 결과를 출력하는 프로그램을 작성하시오.
입력
입력을 여러 줄로 이루어져 있다. 각 줄에 N이 주어진다. 파일의 끝에서 입력을 멈춘다. N은 0보다 크거나 같고, 12보다 작거나 같은 정수이다.
출력
입력으로 주어진 N에 대해서, 해당하는 칸토어 집합의 근사를 출력한다.
예제 입력 1 복사
0
1
3
2
예제 출력 1 복사
-
- -
- - - - - - - -
- - - -
풀이
def cantor_set(n):
if n == 0:
return "-"
else:
prev = cantor_set(n - 1)
return prev + " " * len(prev) + prev
#입력
try:
while True:
n = int(input())
print(cantor_set(n))
except EOFError:
pass
- 길이 1인 문자열 "-"로 시작
- 길이가 3^n인 문자열을 만들기 위해, 이전 문자열의 가운데 부분을 공백으로 대체
풀이 전략
- 재귀적으로 칸토어 집합을 생성
- 기본 문자열은 "-"이고, 각 단계마다 기존 문자열의 가운데에 공백을 추가하여 새로운 문자열을 생성
EOFError 란?
주로 온라인 저지 시스템에서 여러 줄의 입력을 받을 때 사용
백준 문제에서는 사용자가 입력을 종료할 때까지 데이터를 계속 읽기 위해 이 에러를 사용
'Algorithm > 백준' 카테고리의 다른 글
항해99 리부트코스 알고리즘 1주 4일차 단어 공부 (0) | 2024.07.20 |
---|---|
항해99 리부트코스 알고리즘 1주 - 백준 3일차 17478 재귀함수가 뭔가요? (0) | 2024.07.19 |
항해99 리부트코스 알고리즘 1주 - 3일차 팰린드롬 파티션 (0) | 2024.07.19 |
항해99 리부트코스 알고리즘 1주 - 3일차 1074 Z (0) | 2024.07.19 |
항해99 리부트코스 알고리즘 1주 - 2일차 2740 행렬 곱셈 (0) | 2024.07.18 |