코테 탈출일지

[백준] 4673번: 셀프 넘버 - 파이썬/python 본문

구현

[백준] 4673번: 셀프 넘버 - 파이썬/python

히려이 2023. 6. 27. 12:26

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

접근 방식

- 전체 범위 수에서 셀프 넘버가 아닌 수를 빼는 방식으로 고민

- 셀프 넘버를 구하기 위한 전략 고민 (1부터 10000까지 순서대로 탐색하며 각 수에서 생성되는 모든 셀프 넘버가 아닌 수를 조사)

 

코드 풀이

num_list = list(range(1, 10001)) # 전체 범위 수

for num in range(1, 10001):
    non_self = num # 생성자
    for i in str(num):
        non_self += int(i) 
    if non_self in num_list: # non_self = 파생된 새로운 셀프 넘버가 아닌 수
        num_list.remove(non_self) # 셀프 넘버가 아닌 수 제거
        
for self in num_list: # 셀프 넘버만 남게 된 num_list
    print(self)

 

전체 수의 pool 안에서 셀프 넘버가 아닌 수를 제거하는 방식으로 셀프 넘버를 구할 수 있다고 접근했습니다. 1부터 시작하여 파생되는 셀프 넘버가 아닌 수 (2, 4, 8, 16, 23, 28 ...) 를 제거하고, 이어 2부터 시작하여 파생되는 셀프 넘버가 아닌 수 (4, 8, 16, 23, 28 ...), 3부터 시작하여 파생되는 셀프 넘버가 아닌 수 (6, 12, 15, 21, 24 ...)을 제거하여 10000까지 조사했습니다.

 

메모

여집합 개념을 사용할 수 있습니다.