백준/Java
[백준][Java] 4673 - 셀프 넘버
Namani
2023. 8. 1. 01:41
https://www.acmicpc.net/problem/4673
public class Main {
public static int d(int number) {
int sum = number;
/*
1234가 들어온다면
첫 번째 while문
sum = sum + (1234 % 10) -> 1234 + 4
number = 123
두 번째 while문
sum = sum + (1234 + 4) + 3
number = 12
...
*/
while (number != 0) {
sum = sum + (number % 10);
number /= 10;
}
return sum;
}
public static void main(String[] args) {
/*
1 ~ 10000 사이의 셀프 넘버를 구해야 함
인덱스는 0부터 시작하므로 배열 크기를 10001 로 해야만 0~10000 범위 지정 해야 함
*/
boolean[] check = new boolean[10001];
// 셀프 넘버가 아님
for (int notSelfNum = 1; notSelfNum <= 10000; notSelfNum++) {
int n = d(notSelfNum);
if (n < 10001) {
check[n] = true;
}
}
// 셀프 넘버 출력
for (int selfNum = 1; selfNum <= 10000; selfNum++) {
if (!check[selfNum]) {
System.out.println(selfNum);
}
}
}
}
public static int d(int number) {
int sum = number;
while (number != 0) {
sum = sum + (number % 10);
number /= 10;
}
return sum;
}
전달인자로 1234 라는 값이 들어온다면
첫 번째 while문
sum = sum + (1234 % 10) -> 1234 + 4
number / 10 = 1234 / 10 -> 123
두 번째 while문
sum = sum + (123 % 10) -> (1234 + 4) + 3
123 / 10 = 12
세 번째 while문
sum = sum + (12 % 10) -> (1234 + 4 + 3) + 2
12 / 10 = 1
네 번째 while문
sum = sum + (1 % 10) -> (1234 + 4 + 3 + 2) + 1
1 / 10 = 0
다섯 번째 while문은 number가 0이므로 while문 종료 됩니다.
sum에는 1234 + 4 + 3 + 2 + 1 이 합쳐진 1244가 반환 됩니다.
public static void main(String[] args) {
boolean[] check = new boolean[10001];
for (int notSelfNum = 1; notSelfNum <= 10000; notSelfNum++) {
int n = d(notSelfNum);
if (n < 10001) {
check[n] = true;
}
}
for (int selfNum = 1; selfNum <= 10000; selfNum++) {
if (!check[selfNum]) {
System.out.println(selfNum);
}
}
}
boolean[] check = new boolean[10001];
1. boolean 타입으로 배열을 선언하면 디폴트 초기화 값은 false
2. 배열 크기를 10000으로 선언하면 0~9999 선언 됨
3. d(1) = 1 + 2, d(2) = 2 + 2, d(3) = 3 + 3...
모든 값을 다 돌고나면 두 번째 for문을 거치게 되는데, 만약 d(n) 함수로 만들 수 없는 숫자가 있다면 그 숫자가 셀프 넘버이므로 true 값이 저장되지 않아서 false인 상태일 것입니다.
if (!check[selfNum])
를 거치게 되는데, true이면 false로 되어서 값을 출력하지 않게 됩니다. false이면 !를 만나 true가 되므로 값을 출력하게 됩니다.