ps:problems:boj:4673
셀프 넘버
ps | |
---|---|
링크 | acmicpc.net/… |
출처 | BOJ |
문제 번호 | 4673 |
문제명 | 셀프 넘버 |
레벨 | 실버 5 |
분류 |
기초 |
시간복잡도 | O(n) |
인풋사이즈 | n=10000 |
사용한 언어 | Python |
제출기록 | 29968KB / 72ms |
최고기록 | 52ms |
해결날짜 | 2021/11/12 |
태그 |
풀이
- 셀프 넘버에 대해서는 Self number에 이것저것 설명되어 있는데, 이 문제를 푸는데에는 필요없다.
- n은 d(n)보다 작기 때문에, 10000이하에서 셀프 넘버가 아닌 수를 모두 찾으려면, 10000 이하의 모든 n에 대해 d(n)을 계산해보면 된다. 이렇게 구한 목록을 제외하고 나면 남은 숫자들은 셀프넘버이므로 그대로 출력하면 된다.
- 수학적 성질을 연구해보면 좀더 효율적으로 계산할 수 있는 방법이 있을 것 같기도 한데.. 거기까지는 패스.
코드
"""Solution code for "BOJ 4673. 셀프 넘버".
- Problem link: https://www.acmicpc.net/problem/4673
- Solution link: http://www.teferi.net/ps/problems/boj/4673
"""
def d(n):
ret = n
while n:
n, r = divmod(n, 10)
ret += r
return ret
def main():
non_self_numbers = {d(x) for x in range(1, 10000)}
print(*(x for x in range(1, 10000) if x not in non_self_numbers), sep='\n')
if __name__ == '__main__':
main()
ps/problems/boj/4673.txt · 마지막으로 수정됨: 2021/11/15 07:20 저자 teferi
토론