https://www.acmicpc.net/problem/4673
- 문제
- 문제 풀이
백준 4673번 셀프 넘버는 실버 5 난이도의 수학, 구현 및 브루트 포스 문제이다. 이 문제에서는 함수 d(n)이 있다. d(n)은 n과 n의 각 자릿수를 더하는 함수이다. 그리고 n을 d(n)의 생성자라고 한다. 그리고 생성자가 없는 수를 셀프 넘버라고 한다. 이 문제에서는 10000보다 작거나 같은 셀프 넘버들을 전부 출력하면 된다.
이 문제를 풀 때 일단 함수 d를 먼저 구현했다. 이 함수는 n과 n의 각 자릿수를 더하는 함수이니까 우선 int형 변수 sum = n으로 선언했다. 그리고 n을 10씩 나누면서 이 나머지들을 sum에 더해주었다. 이러면 sum은 d(n) 값이 된다.
이제 함수 d(n)이 완성되었으니 메인 메서드만 작성해주면 된다. 우선 사이즈가 10001인 boolean형 배열 arr을 선언했다. 이 배열은 한 자연수가 생성자가 있는지 없는지를 확인해주는 배열이다. 만약에 생성자가 있으면 true로 설정되고, 생성자가 없으면 false로 남는다.
그리고 for-loop을 int i = 1부터 i = 10000까지 돌린다. 1부터 10000까지 모두 함수 d(n)을 적용하고 배열 arr [d(i)]를 모두 true로 바꿔주는 것이다. 이 이유는 1부터 10000까지 for-loop을 돌렸을 때 생성자가 있던 수였던 것이다. 그리고 마지막으로 배열을 iterate 하면서 false인 값들을 전부 출력하면 된다. 이 수들은 생성자가 없는, 즉 셀프 넘버이기 때문이다.
자세한 코드는 밑에 있다.
- 코드
import java.io.*;
import java.util.*;
public class Main {
public static void main(String[] args) throws IOException {
boolean[] arr = new boolean[10001];
for (int i = 1; i <= 10000; i++) {
int num = d(i);
arr[num] = true;
}
StringBuilder sb = new StringBuilder();
for (int i = 1; i <= 10000; i++) {
if (!arr[i]) sb.append(i + "\n");
}
System.out.print(sb);
}
static int d(int n) { //셀프 넘버 함수
int sum = n;
while (n != 0) {
sum += n % 10;
n /= 10;
}
if (sum <= 10000) return sum;
return 0;
}
}
'백준' 카테고리의 다른 글
[백준] 7287번 : 등록 – JAVA [자바] (0) | 2022.07.09 |
---|---|
[백준] 1065번 : 한수 – JAVA [자바] (0) | 2022.07.08 |
[백준] 1157번 : 단어 공부 – JAVA [자바] (0) | 2022.07.08 |
[백준] 15596번 : 정수 N개의 합 – JAVA [자바] (0) | 2022.07.08 |
[백준] 2750번 : 수 정렬하기 – JAVA [자바] (0) | 2022.07.08 |
댓글