처음엔 무슨말인지 잘 이해가 되지않아 한참을 보았다.
요점은 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
==>종료
'알고리즘 > 백준(BAEKJOON)' 카테고리의 다른 글
[10809 자바] 알파벳 찾기 [백준] (0) | 2021.09.16 |
---|---|
백준 /11720 자바/숫자의 합 (0) | 2021.09.15 |
1차원 배열 8958/자바/Scanner/BufferReader (0) | 2021.08.21 |
1546/평균/1차원 배열/자바/JAVA (0) | 2021.03.15 |
3052/백준/JAVA /1차원 배열/나머지 구하기/ HashSet (0) | 2021.03.08 |