알고리즘/백준(BAEKJOON)

4673 셀프넘버 JAVA 백준 문제풀이

jojelly 2021. 9. 13. 02:50
반응형

처음엔 무슨말인지 잘 이해가 되지않아 한참을 보았다. 

요점은 1~10000이하의 생성자가 없는 수 를 구하는것.

 

 

[접근방식]

1.boolean 배열을 선언하여 셀프 넘버를 구분했다. (1~10000이하의 수 이기 때문에 배열의길이를 [10001]로 설정했다.)

 

2. for문을통해 1부터 10000까지 d(i)를 구한다.

 

3. d(i)를 메소드로 계산을 해준 후 나온값을 n저장하고 n의 값이 10001보다 작을경우 배열의[n]값을 true로 선언을 해준다.

 

4.이렇게 한다면 n이 true값으로 있는 수는 생성자가 있다는 뜻! 

 

5.다시한번 for문을 통해 1~10000까지 돌면서 해당 배열에 저장된 값을 돌면서 flase( 생성자가 없는 값)만 출력해준다.                                                                                                                                                

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
public class Main {
    public static void main(String[] args) {
 
        boolean [] a = new boolean[10001];      //1~10000이하이기 때문에 a[0]을 빼고 돌리기때문에 10001로
 
        for (int i = 1; i<10001; i++) {
            int n = d(i);
 
            if (n < 10001) {                    //10000보다 작은 수만
                a[n] = true;
            }
        }
            for (int i = 1; i < 10001; i++) {   //1부터10000까지 돌려서 false만 출력
                if (a[i]==false) {//==는 관계비교연산자
                    System.out.println(i);
                }
            }
 
    }
    public static int d(int number){
        int sum = number;
        while (number != 0){
            sum += number%10;                   // number의 첫째 자리수
            number = number/10;                 //나누기로 첫째자리 수 제외
        }
        return sum;                             // int n이 된다
    }
}
cs

 

d()의 메소드는 우선 들어온 수를 sum에 저장해준 후 while문을 돌린다. 언제까지?! 들어온 수 가 0이 될때까지

 

d()의 계산방법은 문제설명에 나와있는 방법을 응용하면 된다.들어온 number값에 각 자릿수를 더해주면되는것,

1. number값을 10으로나눈 나머지값을 sum에 누적해준다.(그러면 첫번째 자리값이 더해진것)

 

2. 이후 두번째 값을 더해줘야하니 첫번째 자리를 없애준다. (number를 10으로 나누게되면 일의자리수가 사라진다.

 

3.이와같은 방식을 반복하면 각 자릿수를 누적하게 되고 그 값은 sum으로 리턴되어 n이된다.

 

ex)d(4673)의 경우

int sum = number                  ==> 4673;

sum += number % 10                ==> 4673+3

number = number / 10              ==> 467

==>number != 0 ; (while 반복)

 

sum += number % 10           ==>4676+7

number = number / 10 =       ==>46

==>number != 0 ; (while 반복)

 

sum += number % 10           ==>4683 +6 

number = number / 10         ==> 4

==>number != 0 ; (while 반복)

 

sum += number % 10           ==>4689 +4 

number = number / 10         ==> 0

==>종료

반응형