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가 되므로 값을 출력하게 됩니다.
참고
'백준 > Java' 카테고리의 다른 글
[백준][Java] 1316 - 그룹 단어 체커 (0) | 2023.08.05 |
---|---|
[백준][Java] 2743 - 단어 길이 재기 (0) | 2023.07.28 |
[백준][Java] 11654 - 아스키 코드 (0) | 2023.07.27 |
[백준][Java] 2738 - 행렬 덧셈 (0) | 2023.07.27 |
[백준][Java] 5597 - 과제 안 내신 분..? (0) | 2023.07.21 |