위에 셀프넘버의 설명을 읽어보면 만약 수가 13이라는 수가 있으면 13+1+3 (자기자신과 첫째자리+두째자리) = 17이다. 17은 셀프넘버가 아닌 것이다.
그래서 1부터 보면 1+1 = 2 이므로 2는 셀프넘버가 아닌 것 이다.
먼저 함수를 사용하지 않고 풀어 보았습니다.
* Math.log10(n)+1 로 자리수를 쉽게 구할 수 있는 라이브러리도 있습니다.
* charAt() - '0' 해주면 int로 바꿀 수 있습니다.
그냥 더하게되면 아스키코드값으로 더해집니다.
class Main {
public static void main(String args[]) {
boolean result[] = new boolean[10000];
for(int i=0; i<10000; i++){
String tmp_n = Integer.toString(i);
int tmp = 0;
if(tmp_n.length()==1){
tmp = (tmp_n.charAt(0)-'0')+(tmp_n.charAt(0)-'0');
}else if(tmp_n.length()==2){
tmp = i+(tmp_n.charAt(0)-'0')+(tmp_n.charAt(1)-'0');
}else if(tmp_n.length()==3){
tmp = i+(tmp_n.charAt(0)-'0')+(tmp_n.charAt(1)-'0')+(tmp_n.charAt(2)-'0');
}else if(tmp_n.length()==4){
tmp = i+(tmp_n.charAt(0)-'0')+(tmp_n.charAt(1)-'0')+(tmp_n.charAt(2)-'0')+(tmp_n.charAt(3)-'0');
}
if(tmp<10000){
result[tmp] = true;
}
}
for(int i=0; i<10000; i++){
if(result[i] == false){
System.out.println(i);
}
}
}
}
저는 10000개의 boolean 배열을 선언했습니다. 결과를 출력하기 위함입니다. 초기값은 false입니다.
이 배열에 셀프 넘버가 아닌 수를 true로 만들어 줄 것입니다.
먼저 1부터 10000까지 반복 합니다.
i를 문자열로 만들어 줍니다.
그 문자열의 길이값을 알아내고 길이값이 1인지 2인지 3인지 4인지를 체크하여
길이 값 마다 if문으로 연산을 해줍니다.
연산은 0~9 까지는 0+0 , 1+1 , 2+2 이런 값이 되도록 해줍니다.
나머지는 자기자신 + 첫째자리 + 둘째자리 ... 로 계산합니다.
그 후 그 값을 boolean 배열에 해당하는 값에 자리에 true로 바꿔줍니다. 1+1이면 2값 result[2] = true로 해준 것입니다.
tmp는 10000 미만이어야 합니다.
그 후 배열의 개수 만큼 반복하여 true가 아닌 false인 index를 뽑아줍니다.
위에 코드를 함수형으로 만든 것입니다.
class Main {
public int d(int i){
String tmp_n = Integer.toString(i);
int result = 0;
if(tmp_n.length()==1){
result = (tmp_n.charAt(0)-'0')+(tmp_n.charAt(0)-'0');
}else if(tmp_n.length()==2){
result = i+(tmp_n.charAt(0)-'0')+(tmp_n.charAt(1)-'0');
}else if(tmp_n.length()==3){
result = i+(tmp_n.charAt(0)-'0')+(tmp_n.charAt(1)-'0')+(tmp_n.charAt(2)-'0');
}else if(tmp_n.length()==4){
result = i+(tmp_n.charAt(0)-'0')+(tmp_n.charAt(1)-'0')+(tmp_n.charAt(2)-'0')+(tmp_n.charAt(3)-'0');
}
return result;
}
public static void main(String args[]) {
Main m = new Main();
boolean result[] = new boolean[10000];
for(int i=0; i<10000; i++){
int tmp = m.d(i);
if(tmp<10000){
result[tmp] = true;
}
}
for(int i=0; i<10000; i++){
if(result[i] == false){
System.out.println(i);
}
}
}
}
정답은 없습니다. 백준 사이트에도 보면 많은 방법으로 문제가 풀이됩니다.
다른 분들의 코드도 많이 보고 이런 방법도 있구나 해주시면 되겠습니다.
'알고리즘 with JAVA' 카테고리의 다른 글
백준 11654번 아스키코드 - 자바 (0) | 2021.04.04 |
---|---|
백준 1065번 한수 - 자바 (0) | 2021.04.04 |
백준 15596번 정수 N개의 합 (함수) (0) | 2021.03.31 |
백준 4344번 평균은 넘겠지 - BufferedReader, StringBuilder, StringToKenizer, String.format (0) | 2021.03.31 |
백준 8958번 OX퀴즈 - Java (0) | 2021.03.29 |