○ 문제 요약
정수와 해당 정수의 자릿수에 있는 값을 더해서 만든 것을 셀프 넘버라고 한다. 예를 들어, 99라는 정수에 99 + 9 + 9 = 117이 나오는데 이때 99를 '생성자'라고 하는데 생성자가 없는 수를 '셀프 넘버'라고 한다. 셀프 넘버가 출력되도록 프로그램을 작성해라.
○ 문제 풀이 1
public class Main {
public static void main(String[] arge) {
boolean[] boolarr = new boolean[10001];
for(int i = 1 ; i < 10001; i++) {
int n = SelfNumber(i);
if(n < 10001) {
boolarr[n] = true;
}
}
for(int i = 1; i < 10001; i++) {
if(!boolarr[i]) {
System.out.println(i);
}
}
}
static int SelfNumber(int num) {
int result = num;
while(num != 0) {
result += (num%10);
num = num/10;
}
return result;
}
}
메서드를 예제를 넣어 설명하기 앞서 num = 1234라고 정해놓고 시작하겠다.
int result = 1234;
while( 1234 != 0){
result = 1234 + (1234 % 10); >>>> (1234 % 10)을 하면 4가 나오므로 result는 1238이 된다.
num = 1234 / 10; >>>> 1234 / 10을 하면 123이 되고 다시 while문을 실행한다.
}
while( 123 != 0){
result = 1238 + (123 % 10); >>>> (123 % 10)을 하면 3이 나오므로 result는 1241이 된다.
num = 123 / 10; >>>> 123 / 10을 하면 12가 되고 다시 while문을 실행한다.
}
while( 12 != 0){
result = 1241 + (12 % 10); >>>> (12 % 10)을 하면 2가 나오므로 result는 1243이 된다.
num = 12 / 10; >>>> 12 / 10을 하면 1이 되고 다시 while문을 실행한다.
}
while( 1 != 0){
result = 1243 + (1 % 10); >>>> (1 % 10)을 하면 1이 나오므로 result는 1244이 된다.
num = 1 / 10; >>>> 1 / 10을 하면 0이 된다
}
num이 0이 된 상태에서 while문에 다시 들어가면 num != 0 이라는 조건을 충족시키지 못하고 1244를 반환한다.
해당 메서드를 1 ~ 10000까지 실행해서 나온 값을 boolarr에 true로 체크해주고 boolarr가 false인 인덱스를 출력해주면 셀프 넘버를 구할 수 있다.
○ 문제 풀이 2
public class Main {
public static void main(String[] arge) {
boolean[] boolarr = new boolean[10001];
for(int i = 1 ; i < 10001; i++) {
int n = SelfNumber(i);
if(n < 10001) {
boolarr[n] = true;
}
}
for(int i = 1; i < 10001; i++) {
if(!boolarr[i]) {
System.out.println(i);
}
}
}
static int SelfNumber(int num) {
String str = Integer.toString(num);
for(int i = 0; i < str.length();i++) {
num += Integer.parseInt(str.substring(i, i+1));
}
return num;
}
}
이 방법은 substring을 이용했다. 마찬가지로 num은 1234를 예를 들어서 설명하겠다.
int 타입의 num을 String 타입의 str로 변경해준다.
for문을 수행해보면,
for(int i = 0 ; i < str.length();i++){
1235 = 1234 + Integer.parseInt(str.substring(0,1)); >>>> 1이 나온다.
}
for(int i = 1 ; i < str.length();i++){
1237 = 1235 + Integer.parseInt(str.substring(1,2)); >>>> 2이 나온다.
}
for(int i = 2 ; i < str.length();i++){
1240 = 1237 + Integer.parseInt(str.substring(2,3)); >>>> 3이 나온다.
}
for(int i = 3 ; i < str.length();i++){
1244 = 1240 + Integer.parseInt(str.substring(3,4)); >>>> 4이 나온다.
}
최종적으로 num = 1244가 반환된다. 나머지는 문제 풀이 1과 같다.
○ 결과
'문제풀이 > 백준' 카테고리의 다른 글
백준 10989. 수 정렬하기 3(JAVA) (0) | 2022.03.23 |
---|---|
백준 1065. 한수(JAVA) (0) | 2022.03.22 |
백준 4344. 평균은 넘겠지(JAVA) (0) | 2022.03.19 |
백준 1260. DFS와 BFS(JAVA) (0) | 2022.03.18 |
백준 1110. 더하기 사이클(JAVA) (0) | 2022.03.17 |