본문 바로가기

Algorithm

백준 4673 : 셀프 넘버 (자바)

문제

https://www.acmicpc.net/problem/4673

 

접근 방법

Step 1.

셀프 넘버가 아닌 숫자를 찾아내는 함수를 정의한다.

주어진 수에 대해 주어진 수와 주어진 수의 각 자릿수를 합하여 새로운 수를 생성하는 함수를 작성하고, 새로운 수를 1부터 10000까지 담긴 배열에서 제거하는 로직으로 구현할 예정이다.

public static int kaprekar(int number) {
    int sum = number;
    while (number != 0) {
        sum += number % 10;
        number = number / 10;
    }
    return sum;
}

main 함수가 static이기 때문에 kaprekar 함수도 static으로 만들어준다.

 

Step 2.

1부터 10000까지의 모든 양의 정수를 원소로 가지는 배열을 생성한다. 그런데, 실제 수를 담지는 않고 boolean 형식으로 배열을 만든다. selfNumber가 아닌 경우 true로 표시하고, 결과적으로 false를 값으로 가지는 인덱스를 출력할 것이다.

boolean[] isNotSelfNumber = new boolean[10001];

 

Step 3.

위에서 정의한 kaprekar 함수를 1부터 10000까지의 모든 수에 대해 실행하면서 결과값에 해당하는 인덱스의 배열 요소를 true로 설정한다. 이를 통해서 isNotSelfNumber 배열에서 SelfNumber를 인덱스로 가지는 배열의 요소는 false로 남게 된다.

for (int i = 1; i < 10001; i++) {
    int num = kaprekar(i);
    if (num <= 10000) {
        isNotSelfNumber[num] = true;
    }
}

 

Step 4.

isNotSelfNumber 배열을 순회하면서 false인 원소의 인덱스를 출력하면 셀프 넘버만 출력할 수 있다.

for (int i = 1; i < isNotSelfNumber.length; i++) {
    if (!isNotSelfNumber[i]) {
        bw.write(String.valueOf(i));
        bw.newLine();
    }
}
bw.close();

 

전체 코드

import java.io.*;

public class Main {
    public static void main(String[] args) throws IOException {
        BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(System.out));

        // 0부터 10000까지 인덱스를 가지는 공간을 만든다.
        boolean[] isNotSelfNumber = new boolean[10001];

        // kaprekar 함수를 1부터 10000까지 모든 수에 대해 실행하면서
        // kaprekar 함수의 결과값에 해당되는 인덱스의 배열 요소를 true로 설정한다.
        for (int i = 1; i < 10001; i++) {
            int num = kaprekar(i);
            if (num <= 10000) {
                isNotSelfNumber[num] = true;
            }
        }

        for (int i = 1; i < isNotSelfNumber.length; i++) {
            if (!isNotSelfNumber[i]) {
                bw.write(String.valueOf(i));
                bw.newLine();
            }
        }
        bw.close();
    }

    public static int kaprekar(int number) {
        int sum = number;
        while (number != 0) {
            sum += number % 10;
            number = number / 10;
        }
        return sum;
    }
}