728x90
반응형

칸토어 집합 

한국어   
시간 제한메모리 제한제출정답맞힌 사람정답 비율
1 초 128 MB 13045 5981 4882 45.124%

문제

칸토어 집합은 0과 1사이의 실수로 이루어진 집합으로, 구간 [0, 1]에서 시작해서 각 구간을 3등분하여 가운데 구간을 반복적으로 제외하는 방식으로 만든다.

전체 집합이 유한이라고 가정하고, 다음과 같은 과정을 통해서 칸토어 집합의 근사를 만들어보자.

1. -가 3N개 있는 문자열에서 시작한다.

2. 문자열을 3등분 한 뒤, 가운데 문자열을 공백으로 바꾼다. 이렇게 하면, 선(문자열) 2개가 남는다.

3. 이제 각 선(문자열)을 3등분 하고, 가운데 문자열을 공백으로 바꾼다. 이 과정은 모든 선의 길이가 1일때 까지 계속 한다.

예를 들어, N=3인 경우, 길이가 27인 문자열로 시작한다.

---------------------------

여기서 가운데 문자열을 공백으로 바꾼다.

---------         ---------

남은 두 선의 가운데 문자열을 공백으로 바꾼다.

---   ---         ---   ---

한번 더

- -   - -         - -   - -

모든 선의 길이가 1이면 멈춘다. N이 주어졌을 때, 마지막 과정이 끝난 후 결과를 출력하는 프로그램을 작성하시오.

입력

입력을 여러 줄로 이루어져 있다. 각 줄에 N이 주어진다. 파일의 끝에서 입력을 멈춘다. N은 0보다 크거나 같고, 12보다 작거나 같은 정수이다.

출력

입력으로 주어진 N에 대해서, 해당하는 칸토어 집합의 근사를 출력한다.

 

1. 재귀 카테고리이기 때문에 재귀함수로 만들어야 겠다는 생각

2. 3^n 개를 먼저 그리고 나서 지워나가는게 편하겠다고 생각

3. 입력이 끝나면 프로그램이 자동으로 멈춰야하니까 while True : try except 문 써야겠다

 

def space(start, n)

start : 지우기 시작하는 위치

n : 입력받은 N에 대해 3^n을 한 값, 즉 실제 '-'의 개수

 

 n에 따라서 '-' 를 지워나가는 함수

n==3^0 이면 건드릴 거 없음 ('-' 1개 출력)

n == 3^1 부터,

start+n//3 부터 start+(n//3)*2 까지 공백으로 만들어야 함 = 가운데 구멍 뚫기

그리고 start ~ start+n//3 부분과, start +(n//3)*2  ~ 끝 부분에 대해서 같은 과정을 반복해야함

 

def space(start, n):
    if n==1:
        return
    for i in range(start+n//3, start+(n//3)*2):
        result[i] = ' '
    space(start, n//3)
    space(start+n//3*2, n//3)

 


def space(start, n):
    if n==1:
        return
    for i in range(start+n//3, start+(n//3)*2):
        result[i] = ' '
    space(start, n//3)
    space(start+n//3*2, n//3)

import sys

while True:
    try:
        N = int(sys.stdin.readline())
        result=['-']*(3**N)
        space(0, 3**N)
        print(''.join(result))

    except:
        break
반응형

'백준 단계별로 풀어보기 > 재귀' 카테고리의 다른 글

백준 10870 피보나치 수 5  (0) 2022.09.20
백주 10872 팩토리얼  (0) 2022.09.20

+ Recent posts