파이썬 칸토어 집합(백준 BOJ 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

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


📝 풀어보기

이 문제가 재귀 파트에 있어서 함수에서 재귀를 이용해서 만들까 생각했는데 규칙성이 있어서 입력 값에 따라 해당 선을 그리기로 했다.

이 문제에서 입력값 1은 - -을 그린다. (한 패턴의 길이 1, 공백의 길이 1)

입력값 2는 - - - - 를 그린다. (한 패턴의 길이 3, 공백의 길이 3 )

입력값 3은 - - - - - - - - 을 그린다. (한 패턴의 길이 9, 공백의 길이 9)

잘 보면 반복값이 늘어날 때 마다 한 패턴의 전체 길이만큼을 공백으로 만들고 다시 패턴을 반복한다.

이 규칙성을 이용해서 반복값이 입력되면 해당 반복값만큼 for문을 돌려 선을 그리고, 그린값을 다시 변수에 저장해서 반복이 끝난 후에 선을 출력하면 된다.

# input()은 내장 함수로 취급되는 반면, sys에 속하는 메소드들은 file object로 취급된다.
import sys
for i in sys.stdin: # ex) 3이면 i = 3
    line = "-"
    for j in range(int(i)):
        # 1회 - -
        # 2회 - -   - -
        # 3회 - -   - -         - -   - -
        line = line+" "*len(line)+line
    print(line)

관심있을 포스팅