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
결과

중간을 기준으로 대칭임을 확인했는데 그걸 함수로 구현하는 것은 어렵다고 생각했다. 그래서 인터넷에서 찾은 신박한 함수로 문제를 풀었다. 트리구조로도 구현할 수 있겠다는 생각이 들었는데 그것도 함수로 구현하기는 아직 무리인 것 같다. 그래도 배운 것들이 쌓이며 문제를 풀어나갈 방법들을 여러 개 생각할 수 있는 것이 좋은 것 같다.
'스터디 1일 1커밋' 카테고리의 다른 글
| 240310 [BOJ/백준] 1260. DFS와 BFS (0) | 2024.03.10 |
|---|---|
| 240310 [BOJ/백준] 16953. A -> B (0) | 2024.03.10 |
| 240306 [BOJ/백준] 10815. 숫자카드 (1) | 2024.03.06 |
| 240305 [BOJ/백준] 1244. 스위치 켜고 끄기 (0) | 2024.03.05 |
| 240303 [SWEA] 1974. 스도쿠 검증 (0) | 2024.03.03 |