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

+ Recent posts