ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • 220227_JAVA_코딩테스트 연습
    5. 그 외 공부/5.2 코딩테스트 2022. 2. 27. 11:10

    출처 : https://codingdojang.com/scode/365?answer_mode=hide (코딩도장)

     

    <문제>

    어떤 자연수 n이 있을 때, d(n)을 n의 각 자릿수 숫자들과 n 자신을 더한 숫자라고 정의하자.

    예를 들어

    d(91) = 9 + 1 + 91 = 101

    이 때, n을 d(n)의 제네레이터(generator)라고 한다. 위의 예에서 91은 101의 제네레이터이다.

    어떤 숫자들은 하나 이상의 제네레이터를 가지고 있는데, 101의 제네레이터는 91 뿐 아니라 100도 있다. 그런데 반대로, 제네레이터가 없는 숫자들도 있으며, 이런 숫자를 인도의 수학자 Kaprekar가 셀프 넘버(self-number)라 이름 붙였다. 예를 들어 1,3,5,7,9,20,31 은 셀프 넘버 들이다.

    1 이상이고 5000 보다 작은 모든 셀프 넘버들의 합을 구하라.

     

     

    <문제풀이>

    1. 클래스 파일 생성  : SelfNum

    class SelfNum{

     2. 변수 선언 :

     - 범위가 5000까지니까 1의자리~1000의 자리까지의 숫자를 넣을 int형의 변수 (int a,b,c,d)

       int a,b,c,d;

     - 제너레이터를 도출할 정수형 타입의 generator 변수

       int generator;

     - 셀프넘버는 제너레이터의 반대의 수이므로 true/false 로 구분=> boolean[] bool = new boolean[5000-1+1] 활용

       (5000-1+1 : 1~5000사이의 수)

       boolean[] bool = new boolean[5000-1+1];

       제너레이터는 boolean 배열에 넣어주어 true 값으로 대입하게 할것이며, 나머지 false 값이 셀프넘버일것

     - 셀프넘버의 합을 구할 int형 sum 변수 선언

        int sum = 0;

     

    3. 기본생성자 생성

        SelfNum(){}

    4. 메소드 생성

       public void print(){

    5. 반복문 실행 : 1부터 5000 사이의 수의 generator를 구하기 위해서는 반복적으로 각 자리의 수를 더해야 하므로..
         for(int i = 1;i<num;i++) {

    6. 각 자릿수 도출 : 나는 a : 1000의 자리 수, b : 100의 자리 수, c : 10의 자리수 , d : 1의자리수 로 할 예정.
      ( 예: i가 3333이면 1000으로 나누게 되면 int로 3.333이지만 a는 int형이므로 int로 자동 형변환이 되어 소수점 아래

            숫자는 없어짐. 도출된 3에 10의 나머지는 3 이다... 이렇게 반복적으로 다른 자릿수도 구해주면 된다.)
         a = (i/1000)%10; 
         b = (i/100)%10;
         c = (i/10)%10;
         d = i%10;


    7. 각 자리수의 숫자를 더한 후 본인 수까지 더한 수.. generator 변수에 담기
         ex) generator=> 3+3+3+3+3333
          generator = a+b+c+d+i;

    8. 반복문 생성 : generator 값이 1에서 5000 사이의 수라면 boolean 배열의 true 값으로 반환
         if(generator>0&&generator<5000) {bool[result] = true;}

    9. 그러므로 제너레이터는 boolean 배열이 bool[result]값에 true로 반환됨, 반복문 빠져나가기

    }

    10. 우리가 구하고 싶은 것은 제레이터 값이 아닌, 셀프넘버 이기 때문에 위에서 true로 반환하였던 boolean 배열의 제너레이터 값의 false 값을 구해줘야 한다.

    11. 1부터 5000 사이의 범위로 반복문 실행!

    for(int i = 1; i<5000;i++) {

    12. 8번에서 제너레이터 값은 true 값으로 반환하였기 때문에 그 반대의 수를 구하기 위해 gene 배열의 false 값을 도출해줘야함.

      if(gene[i]==false) {sum+=i;}

    13. 1~5000 사이의 셀프넘버를 sum에 더해줌 sum += i ==> sum = sum+i가 계속 누적해서 반복해서 더해지는 것이다.

    14. 반복문 빠져나감
    }
    System.out.println("1부터 5000까지의 셀프넘버의 합은? : ["+sum+"] 입니다.");

    15. print 메소드 빠져나감

    }

    }

    16. SelfNum은 셀프 넘버를 도출하기 위한 설계도 였으며 이 설계도를 표현하기 위해 main 클래스에서 객체 생성

    public class Main {
    public static void main(String[] args) {

     

    17. selfnum 이라는 임의의 인스턴스 생성
       SelfNum selfnum = new SelfNum();

    18. SelfNum 객체의 print 메소드 불러오기

       g1.print();
    }
    }

     

Designed by Tistory.