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

+ Recent posts