본문 바로가기

스터디 1일 1커밋

240306 [BOJ/백준] 4779. 칸토어 집합

 

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

 

4779번: 칸토어 집합

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

www.acmicpc.net


나의 코드

1. 1/3지점 s와 2/3지점 e의 범위가 계속 3등분 된다고 생각해 함수설정 후 실행시킴(실패)

def rec1(x, y):    # s보다 작은 범위 함수 설정
    for i in range(x, y):
        arr[i] = 0
    if x == 0:
        return arr
    x = x // 3
    y = y // 3
    rec1(x, y)


def rec2(x, y):   # e보다 큰 범위 함수 설정
    for i in range(x, y):
        arr[i] = 0
    if y == N-1:
        return arr
    x = (N*2+x) // 3
    y = (2*N+y) // 3
    rec2(x, y)


n = int(input())
N = 3**n
arr = ['-']*(3**n)

s, e = N//3, N*2//3
rec1(s, e)
rec2(s, e)
print(*arr)

결과

입력값 n이 2까지는 잘 나오지만 3부터 제대로 된 결과 도출할 수 없음. 함수를 두 개로 만들면 중간을 기준으로 왼쪽은 왼쪽만 오른쪽은 오른쪽만 제대로 된 결과를 얻을 수 있다.


나의 코드

2. 중간을 기준으로 왼쪽과 오른쪽이 대칭임을 확인, 함수로 만들어서 실행(성공)

def f(x):
    if x == 1:
        return '-'
    else:
        left = f(x//3)
        center = ' '*(x//3)
        return left + center + left


while True:
    try:
        n = int(input())
        N = 3**n
        arr = f(3**n)
        print(arr)

    except EOFError:
        break

 

결과


중간을 기준으로 대칭임을 확인했는데 그걸 함수로 구현하는 것은 어렵다고 생각했다. 그래서 인터넷에서 찾은 신박한 함수로 문제를 풀었다. 트리구조로도 구현할 수 있겠다는 생각이 들었는데 그것도 함수로 구현하기는 아직 무리인 것 같다. 그래도 배운 것들이 쌓이며 문제를 풀어나갈 방법들을 여러 개 생각할 수 있는 것이 좋은 것 같다.