[백준 / 4673] 셀프 넘버


날짜: 2021년 6월 15일
소요 시간: 1시간 26분 34초
카테고리: 수학문제
태그: silver.5, 4673, 파이썬

백준 4673 - 셀프 넘버

입출력 예시

예제 출력 
1 
3 
5 
7 
a lot more numbers 
9971 
9982 
9993 

내가 적은 코드

arr = set(range(1, 10000))
del_arr = set()
for num in arr:
    for i in str(num):
        num += int(i)
    del_arr.add(num)
answer = sorted(arr - del_arr)
print("\n".join(map(str, answer)))

풀이 과정

arr에 10000까지 저장하고 del_arr에 생성자가 존재하는 수를 저장한 뒤,
set함수를 통해 answerarr에서 del_arr을 제외하는 방식으로 셀프 넘버의 배열을 구하는 방식으로 풀었다.

베스트 코드

def self_num(x):
    a = int(x)
    if a > 10000:
        return
    else:
        for j in range(len(x)):
            a += int(x[j])
            if a > 10000:
                return
        check[a] = True
        self_num(str(a))
            
check = [False]*10001
 
for i in range(1, 10000):
    self_num(str(i))
    
for i in range(1, 10000):
    if check[i] ==False:
        print(i)

반성

  • 이제 브론즈 문제는 쉽게 풀겠는데 실버 문제에 대해서는 아직 시간이 너무 오래걸리는 것 같다. 실버 문제 또한 30분 안에 풀 정도로 알고리즘 문제에 익숙해 질 필요가 있다.
  • 재귀 함수로 풀고 싶었으나 재귀 함수에 이해도가 낮아서 포기하고 다른 방식으로 풀었다. 다양한 방식으로 문제를 풀 수 있을 정도로 문제를 많이 풀어봐야겠다.
  • 재귀 함수로 풀고 싶어서 베스트 코드로 재귀함수를 들고 오긴 했으나 아이러니하게도 재귀 함수로 풀면 시간이 45배 정도 더 걸린다. 사실 베스트 코드는 아닌걸로…




© 2021. by hminkim