본문 바로가기
알고리즘/코딩 - 백준

[Java][백준][1065번] 한수

by 주남2 2019. 5. 17.
반응형

문제 설명

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

 

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

 

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

 

생각

자리 수 별로 생각을 해보자. 한 자리 수나 두 자리 수는 무조건 각 자리 수들이 등차수열을 이룬다. 예를 들어보자. 한 자리수는 원소가 한 개 이므로 고민할 필요도 없다. 두 자리수는 26이라고 해보자. 2와 6은 첫째 항이 2이고 등차가 4인 등차수열의 한 부분이라고 볼 수 있다.

 

문제는 3자리 수 부터이다. 3자리 수는 각 자리수를 나눈 후에 등차가 같은지 비교를 해줘야한다. 여기서 %, / 연산자를 사용하여 문제를 풀었다. 문제 조건이 1000보다 작거나 같은 자연수가 주어지는데 1000은 등차수열을 이루지 않으므로 세 자리 자연수의 경우까지만 고려를 했다.

 

코드

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
import java.util.Scanner;
 
public class Main {
 
    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        hansu(sc.nextInt());
    }
    
    static void hansu(int n) {
        int count = 0;
        
        for(int i=1; i<=n; i++) {
            //1부터 n까지의 자연수를 String형태로 만들어 자리수를 구했다.
            //한 자리수와 두 자리수는 등차수열을 이루므로 바로 count를 더해준다.
            String i1 = "" + i;
            switch(i1.length()) {
            case 1:
                count++;
                break;
            case 2:
                count++;
                break;
            case 3:
            //3개의 원소를 갖는 배열을 만들어 각 자리수를 넣어준다.
                int[] a = new int[3];
                int k = i;
                for(int j=0; j<3; j++) {
                    int k2 = k%10;
                    a[j] = k2;
                    k = k/10;
                }
            //등차수열을 이루는지 확인한다.
                if((a[2]-a[1])==(a[1]-a[0])) {
                    count++;
                }
            }
        }
        
        System.out.println(count);
    }
}
http://colorscripter.com/info#e" target="_blank" style="color:#4f4f4f; text-decoration:none">Colored by Color Scripter
 
반응형