백준 4673번 셀프넘버 - 실버5 난이도, 함수

728x90

www.acmicpc.net/problem/4673

 

4673번: 셀프 넘버

셀프 넘버는 1949년 인도 수학자 D.R. Kaprekar가 이름 붙였다. 양의 정수 n에 대해서 d(n)을 n과 n의 각 자리수를 더하는 함수라고 정의하자. 예를 들어, d(75) = 75+7+5 = 87이다. 양의 정수 n이 주어졌을 때,

www.acmicpc.net


위에 셀프넘버의 설명을 읽어보면 만약 수가 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);
      }
    }
  } 
}

 

 

 

정답은 없습니다. 백준 사이트에도 보면 많은 방법으로 문제가 풀이됩니다. 

다른 분들의 코드도 많이 보고 이런 방법도 있구나 해주시면 되겠습니다.

반응형