백준 온라인 저지 문제풀이/JAVA

[baekjoon 1065번] 함수 - 한수

Good Program Good Programmer 2020. 12. 2. 12:23

문제

 

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


문제풀이

 

1. 각 자리수를 배열에 저장한다.

2. 자릿수가 3미만이면 그 수는 한수이다.

3. 자릿수가 3이상인 수의 각 자릿수들 간의 공차를 확인한다.

4. 만약 공차가 모두 같다면 그 수는 한수이지만 공차가 하나라도 다르다면 그 수는 한수가 아니다.

5. 그렇게 n까지의 수들 중 한 수가 몇 개 있는지 세서 출력한다.


소스코드

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
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
import java.io.*;
import java.util.StringTokenizer;
 
public class Main {
 
    // 자릿수를 구하는 함수
    int[] dn(int n) {
        int digits = 0;
 
        // 1. 자릿수를 구한다.
        while(n % Math.pow(10,digits++!= n);
        digits--;
        int[] digits_num = new int[digits];
 
        // 2. 각 자릿수를 배열에 저장한다.
        for(int i = digits-1 ; i >= 0 ; i--) {
            digits_num[i] = (int) (n / Math.pow(10,i));
            n %= Math.pow(10,i);
        }
        // 3. 각 자릿수를 포함한 배열을 리턴한다.
        return digits_num;
    }
 
    /*
    1. 자연수 n을 입력받는다.
    2. 자연수 n보다 작거나 같을 때까지 반복문을 실행한다.
    3. 각 자릿수를 배열로 받아온다.
    4. 자릿수가 3보다 작다면 그 수는 한수이다.
    5. 자릿수가 3보다 크면 각 자릿수들 간의 공차를 계산한다. 이때 공차가 다르다면 해당 수는 한수가 아니다.
    6. 각 자릿수의 공차가 모두 같다면 그 수는 한수이다. 
     */
 
    public static void main(String[] args) throws IOException {
        Main main = new Main(); // d(n)을 실행시킬 객체
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
 
        // 1.
        int n = Integer.parseInt(new StringTokenizer(br.readLine()).nextToken());
        int[] digits_num; // 자릿수를 보관하는 배열
        int flag; // 해당 수가 한수인지 아닌지 판별하는 변수
        int cnt = 0// 한수의 갯수를 세는 변수
 
        // 2.
        for(int i = 1; i <= n ; i++ ) {
            flag = 0;
 
            // 3. 
            digits_num = main.dn(i);
            // 4.
            if(digits_num.length < 3) {
                cnt++;
                continue;
            }
 
            // 5.
            for (int j = 0; j < digits_num.length-2 ; j++) {
                if(digits_num[j+1- digits_num[j] != digits_num[j+2- digits_num[j+1]) {
                    flag = 1;
                    break;
                }
            }
            // 6.
            if(flag == 0) cnt++;
        }
        System.out.println(cnt);
    }
}
cs