🔅코딩테스트 공부🔅/❗백준
[백준] 4673번 셀프 넘버(with python)
윤무무
2023. 1. 19. 18:23
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
일단 문제를 읽으면서 셀프 넘버에 대해 약 57퍼정도 이해를 못 했고, 당연히 혼자서 문제를 해결하지도 못했다.
코드만 봐도 이해가 잘 안돼서 ㅜㅜ 설명이 잘 적혀있는 블로그를 열심히 찾았음 😎
참고 링크 2:https://wook-2124.tistory.com/252
1. 해결한 과정
num_list = set(range(1,10001))
rem_list = set()
for num in num_list:
for nu in str(num):
num+=int(nu)
if num <= 10000:
rem_list.add(num)
self_num = num_list - rem_list
for s in sorted(self_num):
print(s)
1) num_list = set(range(1,10001))
self number은 10000보다 작은 수가 나올 것이기 때문에 1부터 10000이 들어있는 set을 생성한다.
여기서 list가 아닌 set을 생성한 이유는 self number가 중복이 나올 수 있는 확률이 있고, 이를 제거해주기 위해서이다.
2) rem_list = set()
위의 설명과 동일하게, 숫자의 중복을 없애기 위해 set()을 생성한다.
3)
for num in num_list:
for nu in str(num):
num+=int(nu)
아까 생성해놓은 num_list에서 값을 하나씩 꺼내온다.
또한 현재는 정수형이기 때문에 각 자리수를 더하기 위해서 문자열로 바꿔준다.
즉, 38 => 38 + 3 + 8 = 49 와 같은 조건을 맞추기 위해
num을 문자열로 바꿔준 후, 반복문으로 더해주는 것
4) self_num = num_list - rem_list
set 자료형은 A집합에서 B집합을 뺄 수 있기 때문에 rem_list를 빼줌으로써 생성자가 없는 숫자들만 남는다.
5)
for s in sorted(self_num):
print(s)
set은 순서가 없는 자료형이다. 따라서 sorted()함수를 이용해 오름차순으로 정렬해준 후, 하나씩 출력한다.