Algorithm/Baekjoon

백준 / 1065번 / 한수

Gyuri 2023. 1. 9. 15:15

[문제]

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

[입력]

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

[출력]

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

[예제 입력]

110

[예제 출력]

99

[예제 입력]

1

[예제 출력]

1

[예제 입력]

210

[예제 출력]

105

 


 

우선 이 문제는 "한수" 에 대해 이해를 해야한다.

 

123 에서 각 자리를 떼어봤을 때 "1" "2" "3" 이 되는데,

연속된 두 개의 수의 차이가 일정한 수열을 등차수열이라고 하고, 

각 자리가 등차수열을 이루면 그 수를 한수 라고 한다.

123 의 경우 2-1의 차이도 1, 3-2의 차이도 1이므로 한수이다.

 

반면, 

예로 101의 경우

첫번째와 두번째 자리인 1과 0의 경우 -1 이지만,

두번째 자리와 세번째 자리인 0 과 1의 경우 +1 이므로, 한수가 아니다!

 

또한, 1부터 99까지의 모든 수는 한수이다!

 

1 ~ 9 : 수열의 길이가 1인 등차수열

10 ~ 99 : 수열의 길이가 2인 등차수열

+) 두 자리로 이뤄진 수들이 모두 등차수열인 이유?

등차수열은 연속된 두 수 사이의 차이가 일정한 것이다.

예로 14라는 숫자는 공차가 3인 등차수열이다. 두 자리수의 숫자들은 모두 "1개" 의 공차를 갖고있는데,

이를 등차수열로 보는 것이다.

한 자리수도 마찬가지로 1로 예를 들면, 1은 공차가 0인 등차수열이다.

 

따라서, 이 문제에서 굳이 1부터 N까지 전부 구할 필요 없이,

입력 받은 숫자 N이 100보다 작은지 큰지에 따라 달리 처리를 해주면 된다.

 

작은 경우엔 답이 N이 되고,

큰 경우엔 100부터 N까지 한수인 지 검사를 해주면 된다.

import java.util.Scanner;

public class Main {
    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);

        int N = sc.nextInt();

        int num = 0;

        // 100보다 작은 경우
        // 1~99는 한수
        if (N < 100) {
            num += N;
        }

        else {
            num += 99;

            for (int i = 100; i <= N; i++) {
                int n = i;
                int[] arr = new int[3];

                arr[0] = n / 100;
                n %= 100;
                arr[1] = n / 10;
                arr[2] = n % 10;

                if (arr[1] - arr[0] == arr[2] - arr[1]) {
                    num++;
                }
            }
        }

        System.out.println(num);
    }
}

'Algorithm > Baekjoon' 카테고리의 다른 글

백준 / 11726번 / 2×n 타일링  (0) 2023.01.15
백준 / 1158번 / 요세푸스 문제  (0) 2023.01.09
백준 / 13549번 / 숨바꼭질 3  (0) 2023.01.07
백준 / 2712번 / 미국 스타일  (0) 2023.01.06
백준 / 1931번 / 회의실 배정  (0) 2023.01.06