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
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
|
public class Main {
public static void main(String[] args) {
int[] arr = new int[10000]; // { 0,0,0,0,0,0,0...}
for (int i = 0; i < 10000; i++) {
int num = d(i + 1); // 1부터 함수에 넣어본다.
if (num <= 10000) { // 10000 이하의 수 중에서
arr[num - 1] = 1; // 생성자를 가지고 있는 경우 그 (수-1)를 인덱스로 하여 1 입력
}
}
for (int i = 0; i < 10000; i++) {
if (arr[i] == 0) { // 생성자를 가지고 있지 않은 경우
System.out.println(i + 1);
}
}
}
public static int d(int n) {
int sum = n;
while (n != 0) {
sum += n % 10; // 일의 자리 수를 더해준다.
n = n / 10; // 자릿수를 줄여준다.
}
return sum;
}
}
|
cs |
사용된 아이디어를 크게 2가지 경우로 나타낼 수 있다.
1. 어떤 수의 각각의 수를 읽는 방법
결론부터 말하자면, 어떤 수를 뒤에서부터 읽는 느낌으로 자릿수를 줄여나가며 각각의 일의자리 숫자들을 하나씩 읽는 것이다.
위 코드에서 정의한 함수 int d(int n)에 n = 1234을 매개변수로 넣었을 때 어떻게 진행되는지 설명하면 이해가 된다.
n = 1234일때,
sum의 값이 1234가 된다.
while 문에서,
sum은 1234 + 4가 된다.
이후, n은 123이 된다.( n = n / 10 부분. 1234 / 10 == 123 )
sum은 1234 + 4 + 3이 된다.
n은 12가 된다. ( 123 / 10 == 12 )
sum은 1234 + 4 + 3 + 2이 된다.
n은 1이 된다. ( 12 / 10 == 1 )
sum은 1234 + 4 + 3 + 2 + 1이 된다.
n은 0이 된다. ( 1 / 10 == 0 )
while문을 빠져나간다.
sum을 return한다.
2. 0부터든 1부터든 순차적으로 숫자들을 다루기 위해 어떤 배열의 인덱스 넘버를 활용하는 것
int[] arr = new int[10000]; 에서 배열 arr 에는 10000개의 칸이 존재하고 각 칸에는 0이 존재한다.
이때, 인덱스 넘버는 0부터 9999이다.
1부터 10000의 수들을 함수에 매개변수로 넣어주면서 판단하는 과정이므로
1을 넣었을 때 그 판단 결과는 인덱스 넘버 0에 넣어줘야 한다.
그 부분이 위 코드에서
if (num <= 10000) { // 10000 이하의 수 중에서
arr[num - 1] = 1; // 생성자를 가지고 있는 경우 그 (수-1)를 인덱스로 하여 1 입력
}
이다. ( num - 1에 주목하자. )
다시 수들을 출력할 때는 조건에 맞는 인덱스 넘버들을 출력!
!!!!!!!!!!!!!!인덱스의 중요성!!!!!!!!!!!!!!
'알고리즘 및 코테 > 백준' 카테고리의 다른 글
백준 1065번. 한수 (Java) (0) | 2023.02.17 |
---|---|
백준 1110번: 더하기 사이클(Java) (0) | 2023.01.18 |