[Info]Tags categorized posts and contents patterns..

[AJAX] Ajax Code E xamples.. [Book] About the book.. [CSS] CSS Code E xamples.. [DB] Sql Code E xamples.. [DEV] All development stor...

2016년 9월 6일 화요일

[JAVA] Baekjoon 각 자리수가 등차수열을 이루는 지 판별하는 함수를 구현해 문제를 해결해봅니다..

문제
어떤 양의 정수 X의 자리수가 등차수열을 이룬다면, 그 수를 한수라고 한다. 등차수열은 연속된 두 개의 수의 차이가 일정한 수열을 말한다. N이 주어졌을 때, 1보다 크거나 같고, N보다 작거나 같은 한수의 개수를 출력하는 프로그램을 작성하시오. 

입력
첫째 줄에 1,000보다 작거나 같은 자연수 N이 주어진다.

출력
첫째 줄에 1보다 크거나 같고, N보다 작거나 같은 한수의 개수를 출력한다.

이번에는 등차수열이란다.. 아흠.. 등차수열 너무 오래전 얘기라 먼소린지도 모르겠고, 우선 개념부터 잡아야지 하면서 검색하고 있었다.. 그런데 역시나 내 스탈상 정의만 봐서는 이해가 안가고.. 혹시 누군가 부연 설명을 좀 해주지 않았을까 하는 마음에 더 검색을 해봤다..

그런데 역시나 위대한 분들은 세상에 너무 많으시더란 말이지.. occidere 님의 블로그를 가보니 해당 알고리즘에 대한 문제 풀이와 실질적으로 필요한 내용들에 대해서 정리를 잘 해주셨다.. 그래서 문제를 보면서 이해를 할 수 있었다.. 다만, 단번에 이해가 안가서 여러번 읽어봤다능.. ㅠㅜ

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
package step5;

import java.util.Scanner;

public class FuncHanSu {

    @SuppressWarnings("resource")
    public static void main(String[] args) {

        Scanner scan = new Scanner(System.in);
        
        //int valA = 110;
        int valA = scan.nextInt();
        int valK = 0;
        int valHan = 0;
        int varArr[] = new int[3];
  
        for(int i = 1; i <= valA; i++) {
            if(0 < i && i < 100) {
                valHan = i;
            
            } else if(i == 1000) {
                break;
           
            } else {
                valK = 0;
                int valT = i;
                while(valT > 0) {
                    varArr[valK] = valT % 10;
                    valT /= 10; valK++;
                }
                if(varArr[0] - varArr[1] == varArr[1] - varArr[2]) {
                    valHan++;
                }
            }
        }
        System.out.println(valHan);
    }

}//





[JAVA] Baekjoon 자연수 n에 대해 d(n)의 값을 구하는 함수를 정의해 문제를 해결해봅니다..

오랫만에 코딩 테스트를 올려본다.. 이제 곧 있음 명절인데 모두 즐거운 명절을 맞이 하시길 바라며..

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

양의 정수 n이 주어졌을 때, 이 수를 시작해서 n, d(n), d(d(n)), d(d(d(n))), ...과 같은 무한 수열을 만들 수 있다. 

예를 들어, 33으로 시작한다면 다음 수는 33 + 3 + 3 = 39이고, 그 다음 수는 39 + 3 + 9 = 51, 다음 수는 51 + 5 + 1 = 57이다. 이런식으로 다음과 같은 수열을 만들 수 있다.

33, 39, 51, 57, 69, 84, 96, 111, 114, 120, 123, 129, 141, ...

n을 d(n)의 생성자라고 한다. 위의 수열에서 33은 39의 생성자이고, 39는 51의 생성자, 51은 57의 생성자이다. 생성자가 한 개보다 많은 경우도 있다. 예를 들어, 101은 생성자가 2개(91과 100) 있다. 

생성자가 없는 숫자를 셀프 넘버라고 한다. 100보다 작은 셀프 넘버는 총 13개가 있다. 1, 3, 5, 7, 9, 20, 31, 42, 53, 64, 75, 86, 97

10000보다 작거나 같은 셀프 넘버를 한 줄에 하나씩 출력하는 프로그램을 작성하시오.

입력
입력은 없다

출력
10,000보다 작거나 같은 셀프 넘버를 한 줄에 하나씩 증가하는 순서로 출력한다.

해당 문제는 나 스스로 풀진 못했다.. 다른 분이 하신 것을 보면서 문제의 의도와 풀어나가는 과정을 익혔다.. 그런데 아마도 이제 그런 문제가 더 많아질 것으로 보인다.. 아쉽기는 하지만 나 스스로 생각하는 과정 등을 더 발전해보고자 시작했기에 그런 측면에서는 만족한다..

이 문제는 다른 부분 보다는 셀프넘버에 대한 개념과 이해가 가장 중요하다고 생각 된다.. 나두 처음 문제를 접했을 때 문제를 푸는게 문제가 아니라 셀프넘버 자체를 이해를 못하고 있다보니 다른분들이 풀어둔 문제를 봐도 소스 자체가 이해가 안갔다..

정의를 찾다보니 영문으로 된 글도 있었다.. 영문이어서 번역기 돌려서 봤는데 그래도 어느정도의 개념은 문제들과 더블어 이해하다보면 납득?? 은 가더란.. ㅎㅎ



 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
package step5;

//import java.util.Scanner;

public class FuncNum {

    //@SuppressWarnings("resource")
    public static void main(String[] args) {
  
        //Scanner scan = new Scanner(System.in);
        
        int valA = 0;
        int valB = 0;
        int valC = 0;
        int valD = 0;
        int valResult = 0;
  
        boolean[] generator = new boolean[10000];
        
        for(int i = 1; i < 10000; i++) {
            valA = i / 1000;
            valB = (i / 100) % 10;
            valC = (i / 10) % 10;
            valD = i % 10;
            
            //System.out.println("valA ######## > " + valA);
            //System.out.println("valB ######## > " + valB);
            //System.out.println("valC ######## > " + valC);
            //System.out.println("valD ######## > " + valD);
            //System.out.println("================================");
            
            valResult = valA + valB + valC + valD + i;
         
            if((valResult >= 1) && (valResult < 10000)) {
                generator[valResult] = true;
            }
        }
        
        for(int i = 1; i < 10000; i++) {
            if(generator[i] == false) {
                System.out.println(i);
            }
        }
    }

}//