1 minute read


Input-1
110
Output-1
99

Input-2
210
Output-2
105

Input-3
1000
Output-3
144


문제 풀이

문제 풀이에 앞서 한수가 무엇인지 이해가 잘 되지 않았다.
한수를 알려면 등차수열에 대해서도 알아야 한다.

한수란?
어떤 정수 A의 각 자리수가 등차수열을 이루는 수이다.

등차수열이란?
연속된 두 개의 수의 차이가 일정한 수열을 말한다.

  1. 그러면 1부터 9까지는 항이 하나뿐인데 등차수열인가?
    1~9까지는 하나의 등차수열로 본다.

  2. 그러면 10부터 99까지는 항이 두개인데 등차수열인가?
    10의 경우 길이가 2이고 첫번째 항이 1, 두번째 항이 0이며 공차가 -1인 등차수열로 볼 수 있다.

두자리수인 99까지는 모두 등차수열인 것이다.

자 그러면 100부터 주어진 수(N)의 자리수별 차이가 같은 수를 찾으면 된다.

주어진 수가 100 이상이라면 각 자리수를 구하여 첫째항과 둘째항의 차와 둘째항과 셋째항의 차가 같은지 검증하는 로직을 checkHansoo 함수에 작성하였다.

1
2
3
4
5
6
7
8
9
public static int checkHansoo(int n) {
        ArrayList<Integer> list = new ArrayList<>();
        while(n > 0) { // 주어진 수(n)의 자리수를 구해 list에 저장
            list.add(n % 10);
            n /= 10;    
        }
        if((list.get(0)-list.get(1)) == (list.get(1)-list.get(2))) return 1;
        else return 0;
    }

마지막은 결국 주어진 수까지 한수의 개수를 구하는 것이기에 주어진 수(N)만큼 반복하며 한수의 개수를 측정하였다.

1
2
3
4
5
6
7
8
if(n < 100) hs = n; // 1부터 99까지는 모두 한수
else { // 100부터 1000까지
    hs = 99;
    for (int i=100; i<=n; i++) {
        hs += checkHansoo(i);        
    }   
    if(n == 1000) hs -= 1; 
}


작성코드

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
import java.io.*;
import java.util.*;

class Main {

    public static void main(String[] args) throws IOException {
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(System.out));
        int n = Integer.parseInt(br.readLine());
        int hs = 0;

        if(n < 100) hs = n;
        else {
            hs = 99;
            for (int i=100; i<=n; i++) {
                hs += checkHansoo(i);        
            }   
            if(n == 1000) hs -= 1; 
        }

        bw.write(hs + "\n");
        bw.flush();
        bw.close();
        br.close();
    }

    public static int checkHansoo(int n) {
        ArrayList<Integer> list = new ArrayList<>();
        
        while(n > 0) {
            list.add(n % 10);
            n /= 10;    
        }

        if((list.get(0)-list.get(1)) == (list.get(1)-list.get(2))) return 1;
        else return 0;
    }
}

회고

  • 4673번 셀프넘버 문제에서도 정수의 자리수를 알아야 했는데 이번 1065 문제에서도 동일한 요구사항이 있었던 것으로 보아 자리수 별로 접근하는 방식을 명확하게 알고 있어야 한다고 느꼈다.