Data Science/알고리즘 공부

[백준][파이썬] 4763번 셀프넘버

titaniumm 2020. 3. 13. 22:54
for k in range(1,10000):
    count = 0
    for i in range(1,k):
        sum =0
        litt = list(str(i))
        for j in litt:
            sum = int(j)+sum
        sum = sum + i
        if sum == k:
            count +=1
    if count == 0:
        print(k)

위의 코드와 같이 이중포문을 작성하여 모든 수를 계산하는 방식을 했다.

하지만 시간초과가 발생했다. 이후에 재귀함수로 했지만 10000번이 넘게 돌아서 그런지 오버플로우가 발생했다

이를 해결하기 위해선 set수를 활용한 생각의 전환이 필요했다.

num = set(range(1,10001))
generated_num = set()
for i in range(1,10001):
    for j in str(i):
        i += int(j)
    generated_num.add(i)
self_num = num - generated_num
for k in sorted(self_num):
    print(k)

1. set의 중복제거 특징

2. 교집합 합집합처럼 빼고 더할 수 있는 특징