문제부터 어렵다
셀프 넘버는 n과 n의 각 자리수를 더하여 만들어질 수 없는 숫자, 즉 임의의 n에 대하여 d(n)으로 return될 수 없는 숫자라는 의미이다.
출력값에 1,3,5,7,9만 보고 소수빼기인줄 알았다
맨 처음엔 일반 배열에 넣었다가 출력하는 로직을 짤때 복잡해져서
다른 코드를 참고해서 boolean형 배열로 바꿔주었다..
값 비교해서 false값만 출력하면 되니까 훨씬 편했다
package 백준;// @ author ninaaano
public class b_4673 {
public static void main(String[] args) {
boolean[] check = new boolean[10000];
for (int i = 1; i < 10001; i++) {
int num = i;
int sum = i;
while (num != 0) {
sum +=(num % 10); // 첫째 자리수
num = num / 10; // 10을 나눠서 첫 째 자리 없애기
}
if(sum < check.length){
check[sum] = true;
}
}
for(int j=1; j<check.length; j++){
if(check[j]==true)
continue;
System.out.println(j);
}
}
}
list나 set을 사용해서 푸는 방법도 있었다.
파이썬 코드는 나중에 자바 코드로 변환하는 작업을 해봐야징..
출처를 남기려했는데 날아가버렸다...😱😱😱
// 참고 파이썬코드, list, set
def d(n):
num = list(str(n))
asw = n
for i in range(len(num)):
asw += int(num[i])
return asw
SET = list(range(1,10001))
for n in range(1,10001):
if d(n) in SET:
SET.remove(d(n))
for i in range(len(SET)):
print(SET[i])
// 참고코드, HashSet사용
import java.io.IOException;
import java.util.HashSet;
import java.util.Set;
public class Main {
public static void main(String[] args){
Set<Integer> set = new HashSet<>();
int cnt = 1;
while(cnt <= 10000){
char[] chars = String.valueOf(cnt).toCharArray();
int tmp = cnt;
for(char data : chars){
tmp += Integer.parseInt(String.valueOf(data));
}
if(!set.contains(cnt)){
System.out.println(cnt);
set.add(tmp);
} else {
set.add(tmp);
}
cnt++;
}
}
}