티스토리 뷰
백준 4673번 셀프 넘버
알고리즘 분류: 구현
링크: https://www.acmicpc.net/problem/4673
문제
셀프 넘버는 1949년 인도 수학자 D.R. Kaprekar가 이름 붙였다. 양의 정수 n에 대해서 d(n)을 n과 n의 각 자리수를 더하는 함수라고 정의하자. 예를 들어, d(75) = 75+7+5 = 87이다.
양의 정수 n이 주어졌을 때, 이 수를 시작해서 n, d(n), d(d(n)), d(d(d(n))), ...과 같은 무한 수열을 만들 수 있다.
예를 들어, 33으로 시작한다면 다음 수는 33 + 3 + 3 = 39이고, 그 다음 수는 39 + 3 + 9 = 51, 다음 수는 51 + 5 + 1 = 57이다. 이런식으로 다음과 같은 수열을 만들 수 있다.
33, 39, 51, 57, 69, 84, 96, 111, 114, 120, 123, 129, 141, ...
n을 d(n)의 생성자라고 한다. 위의 수열에서 33은 39의 생성자이고, 39는 51의 생성자, 51은 57의 생성자이다. 생성자가 한 개보다 많은 경우도 있다. 예를 들어, 101은 생성자가 2개(91과 100) 있다.
생성자가 없는 숫자를 셀프 넘버라고 한다. 100보다 작은 셀프 넘버는 총 13개가 있다. 1, 3, 5, 7, 9, 20, 31, 42, 53, 64, 75, 86, 97
10000보다 작거나 같은 셀프 넘버를 한 줄에 하나씩 출력하는 프로그램을 작성하시오.
입력
입력은 없다.
출력
10,000보다 작거나 같은 셀프 넘버를 한 줄에 하나씩 증가하는 순서로 출력한다.
문제 파악
이 문제의 핵심은 셀프 넘버가 무엇인지를 알아내는것이다.
셀프 넘버란 쉽게말해서 누군가를 더해서 나올 수 없는 수를 뜻한다.
예를들어 123이란 수가 있다면 123 + 1 + 2 + 3으로 129가 생성되는데
이런식으로 생성될 수 없는 수가 바로 셀프 넘버이다.
더 쉽게 예를 들어보자면 10보다 작은 셀프 넘버는 1, 3, 5, 7, 9가 있다.
1부터 시작한다고 치면
1 + 1 = 2
2 + 2 = 4
3 + 3 = 6
이런식으로 자기 자신의 수와 각 자리수의 합으로 만들어지는 어떤 임의의 수는 셀프 넘버가 될 수 없다.
코드
코드가 조금 길어서 지저분해 보일 수 있지만 결론부터 말하자면
1부터 10000까지의 수가 담겨있는 리스트에서 셀프 넘버가 될 수 없는 수들을 뺄 것이다.
self_list라는 리스트에 1부터 10000까지의 수를 담아둔다.
10000보다 작거나 같은 셀프 넘버를 출력해야 되기 때문에 10000이 들어갔을때는 생성되는 수가 10001이 된다.
그러므로 10000보다 작거나 같은 셀프 넘버들은 모두 4자리수 이하라고 가정하고 문제를 풀면된다.
자기 자신의 수와 각 자리수를 더해야 하기 때문에 str형과 int형을 잘 바꿔가며 사용한다.
이렇게 생성되는 셀프 넘버가 될 수 없는 수들은 num_list에 담아둔다.
num_list에 있는 수들은 셀프 넘버가 될 수 없기 때문에 self_list에서 num_list에 있는 수들을 지워준다.
마지막으로 self_list에 있는 수들을 한줄씩 출력해주면 끝이다.
단계별로 풀어보기에서 함수 단계에 있길래 함수를 작성해서 풀었는데
굳이 함수를 만들지 않아도 풀 수 있는 문제인 것 같다.
'Python 알고리즘' 카테고리의 다른 글
백준 2292번 파이썬 풀이: 벌집 (1) | 2020.09.03 |
---|---|
백준 1065번 파이썬 풀이: 한수 (0) | 2020.09.02 |
백준 3052번 파이썬 풀이: 나머지 (0) | 2020.09.01 |
백준 10996번 파이썬 풀이: 별 찍기 - 21 (0) | 2020.09.01 |
백준 10871번 파이썬 풀이: X보다 작은 수 (0) | 2020.09.01 |