문제
셀프 넘버는 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보다 작거나 같은 셀프 넘버를 한 줄에 하나씩 증가하는 순서로 출력한다.
예제입력 |
예제출력 |
1 3 5 7 9 20 31 42 53 64 | | <-- a lot more numbers | 9903 9914 9925 9927 9938 9949 9960 9971 9982 9993 |
문제풀이
우선, 도대체 셀프넘버가 무엇인가?에 대해서 이해가 가지 않았다.
메모장으로 간단하게 적어봤는데 이해가 될지 모르겠다.
1+1 = 2
2+2 = 4
3+3 = 6
4+4 = 8
5+5 = 10
6+6 = 12
7+7 = 14
8+8 = 16
9+9 = 18
10+1+0 = 11
11+1+1 = 13
12+1+2 = 15
13+1+3 = 17
14+1+4 = 19
15+1+5 = 21
16+1+6 = 23
17+1+7 = 25
18+1+8 = 27
19+1+9 = 29
20+2+0 = 22
21+2+1 = 24
22+2+2 = 26
23+2+3 = 28
24+2+4 = 30
25+2+5 = 32
......
91+9+1 = 101
......
100+1+0+0 = 101
위에 해당되지 않는 번호가 셀프넘버이다. 즉, [ 1, 3, 5, 7, 9, 20, 31 ....... ] 이다.
우선 숫자를 한개씩 나눠서 배열로 만들어서 더하는데 사용했다
set을 이용해서 위에서 나온 결과값을 add 하고 count를 하나씩 올리며
contains로 해당되는 값이 있으면 셀프넘버가 아닌 값을 넣어주고
contains로 해당되는 값이 없으면 셀프넘버이기 때문에 cnt를 출력해주고 값을 set에 넣어주었다.
화가 나는건 단계별로 풀어보기를 함수 만들기 분류로 해놓고
첫 문제에 class Test{ long sum(int[] a)} 이런식으로 함수로 생성하게 해서 이번 문제도 그렇게 하라는건가? 했는데 아니어서 엄청 틀렸다;
class는 Main으로 하고, main으로 시작하라는 친절한 설명이 1도 없다.
이것도 의도한 것일까?
import java.io.IOException;
import java.util.HashSet;
import java.util.Set;
public class Main {
public static void main(String[] args){
Set<Integer> set = new HashSet<>();
int cnt = 1;
while(cnt <= 10000){
char[] chars = String.valueOf(cnt).toCharArray();
int tmp = cnt;
for(char data : chars){
tmp += Integer.parseInt(String.valueOf(data));
}
if(!set.contains(cnt)){
System.out.println(cnt);
set.add(tmp);
} else {
set.add(tmp);
}
cnt++;
}
}
}
'Etc > problem solving' 카테고리의 다른 글
백준 11654, 아스키 코드 (0) | 2021.10.27 |
---|---|
백준 1065, 한수 (0) | 2021.10.26 |
백준 15596, 정수 N개의 합 (0) | 2021.10.10 |
백준 4344, 평균은 넘겠지 (0) | 2021.10.10 |
백준 8958, OX퀴즈 (0) | 2021.10.10 |