Algorithm

[백준] 1065번 - 한수 (Java)

haehyun 2022. 2. 4. 17:33

문제

단계별 풀어보기 - 함수, https://www.acmicpc.net/problem/1065 

 

1065번: 한수

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

www.acmicpc.net

*한수 : 각 자리가 등차수열을 이루는 양의 정수.

 

코드

import java.util.Scanner;

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

        for(int i = 1; i <= N; i++){
            if(isHansu(i)){
                count++;
            }
        }

        System.out.println(count);
    }

    // 한수 체크
    static boolean isHansu(int n){
        if(n < 100) { return true; }

        int right = n % 10;         // 오른쪽 수
        n /= 10;
        int left = n % 10;          // 왼쪽 수
        n /= 10;
        int diff = right - left;    // 두 수의 차이 (절대값 아님, +- 구분 주의)

        while(n > 0){
            right = left;
            left = n % 10;
            n /= 10;

            if(diff != right - left)
                return false;
        }
        return true;
    }
}

 

  • 반복문을 통해 1~N 까지 수에 대해 차례대로 한수여부를 체크한다.
  • 한수 여부를 체크하는 코드를 isHansu(int n) 메서드로 분리
    • 1자리, 2자리 양의 정수는 비교할 자리수가 하나뿐이라 무조건 한수이다. (ex: 1, 2, ..., 98, 99)
    • 3자리 이상 양의 정수는 1의 자리수(right)와 10의 자리수(left) 값을 추출해서 차이(diff)를 구한다.
    • 이후, 100의 자리수 부터 왼쪽으로 하나씩 값을 추출해 차이를 구한다.
    • 차이가 처음 구했던 diff와 다를 경우 한수가 아니다.

  • 두 자리수의 차이를 구할 때 Math.abs()로 절대값을 구하지 않도록 주의하자. 무심결에 diff = Math.abs(right - left); 와 같이 구하게 되면 101, 202, 303 등 수도 한수로 받아들이게 된다.