본문 바로가기

Algorithm

[JAVA]백준 4673 - 셀프 넘버

 

백준의 4673번 문제인 셀프넘버이다.

10000 이하의 생성자가 없는 숫자를 출력하는 것이 목표이다.

 

입력은 없고 출력만 있다.

 

이로 인해 숫자 N값을 넣어 출력시키면 된다 생각했다.

 

일단 생성자를 구할 수 있는 메서드를 어떻게 구현할지 생각을 해 보았는데,

첫번째로 10,000 이하의 정수만 생각한다 하여 1000의 자리 숫자, 100의자리 숫자, 10의자리 숫자, 1의자리 숫자를 구할 수 있는 방법을 생각했다.

 

1000의 자리 숫자 :  입력된 값에 1000을 나눈 몫

100의 자리 숫자 : 입력된 값에 100을 나누어 나온 몫에 10을 나누어 나온 나머지

10의 자리 숫자 : 입력된 값에 10을 나누어 나온 몫에 10을 나누어 나온 나머지

1의 자리 숫자 : 입력된 값에 10을 나누어 나온 나머지

 

로 생각하였다.

추가로 어차피 입력된 숫자가 100의 자리 숫자여도, 1000으로 나눌 경우 1000의자리 숫자는 0이 나오기 때문에 이렇게 계산식을 적었다.

 

모든 연산을 마친 후 나온 모든 자리 숫자와 입력된 수를 더해 나온 결과값을 반환해주는 메서드를 만들었다.

 

그리고, 나는 첫번째 n의 값을 1로 정해준 후 생성자를 출력시킬 수 있는 방법을 생각해 보았다.

일단 n의 값을 1로 두고, 반환된 값을 n으로 두면 모든 생성자가 나올 수 있지 않을까 생각했다. 하지만, n = 2일 경우의 생성자, n = 3일경우의 생성자들이 모두 다를거라 생각되었고, n = result 가 아닌 n을 1씩 증가시켜 생성자를 받아올 수 있도록 했다. (ArrayList에 add하여 중복값을 제거했다.)

 

나는 1 ~ 10000까지의 숫자를 담은 ArrayList에서 생성자를 모두 remove해주는 방법을 생각했다.

for문을 이용해 1 ~ 10000까지의 숫자를 모두 담고, 

 

위와 같이 생성자를 구하는 메서드를 통해 나온 값들을 ArrayList에 담았다.

 

위와같이 1 ~ 10000까지의 숫자가 담긴 ArrayList에서 생성자 값들을 remove시켜주었고,

 

생성자가 없는 모든 값들을 출력시켜주었다.

 

결과는 정답이다!

 

 

전체코드

import java.util.ArrayList;
import java.util.List;

public class problem4673 {
    public static void main(String[] args) {
        int n = 1;
        int result = 0;
        List<Integer> arr = new ArrayList<>(); // 1 ~ 10000까지 있는 List
        List<Integer> self_arr = new ArrayList<>(); // 생성자가 있는 수를 담을 List

        for(int i = 1; i <= 10000; i++) {
            arr.add(i);
        }

        while(n < 10000) {
            result = self_number(n);
            self_arr.add(result);
            n++;
        }

        for(int i = 0; i < self_arr.size(); i++) {
            arr.remove(self_arr.get(i));
        }

        for(int i = 0; i < arr.size(); i++) {
            System.out.println(arr.get(i));
        }
    }

    // 생성자가 있는 함수 만들기
    static int self_number(int n) {
        int n_1000 = n / 1000;
        int n_100 = (n/100) % 10;
        int n_10 = (n/10) % 10;
        int n_1 = n % 10;

        int result = n + n_1000 + n_100 + n_10 + n_1;

        return result;
    }
}