본문 바로가기

알고리즘/백준

백준 4779번 : 칸토어 집합(S3)

https://www.acmicpc.net/problem/4779

문제

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

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

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

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

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

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

 

내 코드

import sys
from collections import deque

#input = sys.stdin.readline # EOF까지 받는 문제에서는 사용 금지

def cut(line) :
    if (line.count('-') == 1) :
        return line 
    else : 
        left = line[:len(line)//3]
        mid = line[len(line)//3 : (len(line)//3 * 2)].replace('-'," ")
        #print(f"mid = {mid}, len(mid) = {len(mid)}")
        right = line[(len(line)//3 * 2):]
        array = cut(left) + mid + cut(right)
        return array

def main() :
    while True :
        try :
            n = int(input())
            if not (0<= n <= 12) :
                break
            n = 3**n
            line = '-'*n
            print(cut(line))
        except EOFError :
            break

    
if __name__ == "__main__" :
    main()

 

느낀점

1. EOF까지 입력 받는 문제에서는 sys.stdin.readline 금지. (이것때매 오류 잡느라 10분 쓴듯)

2. EOF까지 입력 받으려면 try - except EOFErroe  해줘야한다.

3. 재귀 연습을 더 해보자(감익히기)

 

풀이 시간