[백준] #4673 - 셀프 넘버 (파이썬, Python)

셀프 넘버

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

내가 쓴 코드

다음 d를 구할 때, 생성자를 문자열로 바꾸고 각 자릿수만 숫자로 다시 바꾸는 방법으로 비교적 간편하게 각 자릿수의 합을 구할 수 있지만, 나머지와 나눗셈을 이용하는 방법이 성능면에서 더욱 좋다.

self_nums = [True] * 10001
for i in range(1, 10001):
    if not self_nums[i]:
        continue

    print(i)

    now = i
    while True:
        next = now
        while now > 0:
            next += now % 10
            now //= 10

        if next > 10000:
            break

        self_nums[next] = False
        now = next

집합 자료형을 이용한 코드

위 코드로 정답 판정을 받은 뒤에 인터넷에서 검색해 찾은 방법이다.

집합 자료형을 사용하면 손쉽게 자료의 중복을 필터링할 수 있다.
이렇게 remove_set에 자료를 넣으면 알아서 중복은 사라지고 이후에 전체에서 빼주면 쉽게 셀프 넘버를 구할 수 있다.

이 방법이 내가 생각한 방법보다 더욱 빠르다.

remove_set = set()
for i in range(1, 10001):
    d = i
    while i > 0:
        d += i % 10
        i //= 10

    remove_set.add(d)

self_nums = sorted(set(range(1, 10001)) - remove_set)
print(*self_nums, sep="\n")

좋은 웹페이지 즐겨찾기