DS & Algorithm

[백준/BOJ] 1065_한수(Java)

didue 2021. 12. 5. 22:56
반응형

 

문제

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

입력

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

출력

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

예제 입력 1

입력 : 110
출력 : 99

예제 입력 2

입력 : 1
출력 : 1

풀이

문제를 되짚어 보자면, 양의 정수의 각 자리의 수(백의 자리 수, 십의 자리 수, 일의 자리 수..)가

각각 등차수열(같은값으로 증감하는 패턴이 있는 수열)을 이룰 때 이것을 "한수" 라고 부르기로 한다.

 

예를 들어, 

양의정수 1234는 각 자리 수마다 1씩 증가하는(공차가 1인) 등차수열을 이루므로 한수에 해당된다.

또한, 양의정수 555도 각 자리 수가 0씩 증가하는 등차수열에 해당한다.

 

 

이를 바탕으로 정리해보면,

 

1000보다 작은 양의 정수 입력 N이 들어올 때

 

(1) 일의 자리 수 : 1 ~ 9의 자연수는 모두 한수이다.

(2) 십의 자리 수 : 10~99의 자연수는 두 수 사이의 공차가 1개이므로 모두 한수이다.

(3) 백의 자리 수 : 100 ~ 999의 자연수는 백의 자리, 십의 자리의 공차와 십의 자리, 일의 자리의 공차가 

같음을 확인되어야 한수이다.

 

 

풀이 코드

import java.io.BufferedReader;
import java.io.InputStreamReader;

public class Main {
    public static void main(String[] args) throws Exception {
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        String str = br.readLine();

        int n = Integer.parseInt(str);
        int count = getNumberOfSequence(n);
        System.out.println(count);
    }

    public static int getNumberOfSequence(int num){
        //입력값이 100미만이면 모두 한수이므로, 곧 입력값 = 한수의 갯수
        if(num < 100) {
            return num;
        }
		
        //1~99까지는 모두 한수이므로 초기화 값은 99
        int cnt = 99;								
        for(int i=100 ; i<=num ; i++){
            if(isSequence(i)){
                cnt++;
            }
        }
        return cnt;
    }

    public static boolean isSequence(int num) {
        int first = num / 100;		//백의자리 숫자
        int sec = (num / 10) % 10;	//십의자리 숫자
        int third = num % 10;		//일의자리 숫자

        return first - sec == sec - third;
    }
}
반응형