728x90
https://www.acmicpc.net/problem/4673
4673번: 셀프 넘버
셀프 넘버는 1949년 인도 수학자 D.R. Kaprekar가 이름 붙였다. 양의 정수 n에 대해서 d(n)을 n과 n의 각 자리수를 더하는 함수라고 정의하자. 예를 들어, d(75) = 75+7+5 = 87이다. 양의 정수 n이 주어졌을 때,
www.acmicpc.net
해당 문제는 입력이 없다...
그래서 그냥 바로 배열 출력해도 답은 맞을 거 같기도 하다.
그래도 일단 풀어보자.
처음에 헷갈린 부분인데, 10 미만의 수는 그 수 자체가 되는 것인 줄 알았다.
하지만 2, 4, 6, 8... 이렇게는 셀프 넘버가 아닌 것을 보고 d(1) = 1 + 1 = 2가 된다는 것을 깨닫고 풀 수 있게 되었다.
만약 푸는 중간에 알게 되었다면 고생 좀 했을 것 같다.
우선 d(n)에 대한 함수를 만들어주자.
def d(n):
d_result = n
while n > 9:
d_result += (n % 10)
n //= 10
return d_result + n
해당 수와 쪼갠 수들을 모두 더해서 반환해주는 d(n) 함수이다.
result = [True for i in range(1, 10001)]
def d(n):
d_result = n
while n > 9:
d_result += (n % 10)
n //= 10
return d_result + n
for i in range(1, 10000):
if result[i]:
print(i)
num = i
while num < 10000:
num = d(num)
if num < 10000:
result[num] = False
1부터 10000까지 반복을 하면서 만약 result[i]에 대한 수가 True라면 해당 수를 출력하고, 그 수로 만들 수 있는 수들을 연쇄적으로 모두 지워준다.
'알고리즘 > 브루트포스' 카테고리의 다른 글
백준 14501 퇴사 (0) | 2024.01.15 |
---|---|
백준 1182 부분수열의 합 (0) | 2024.01.15 |
백준 1065 한수 (0) | 2024.01.15 |
게임판 덮기 (0) | 2022.09.17 |
소풍 (1) | 2022.09.16 |