본문 바로가기
백준

[백준] 1065번 : 한수 – JAVA [자바]

by Hongwoo 2022. 7. 8.
반응형

https://www.acmicpc.net/problem/1065

 

1065번: 한수

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

www.acmicpc.net

 


  • 문제

 

 


  • 문제 풀이

백준 1065번 한수는 실버 4 난이도의 브루트 포스 문제이다. 만약에 자연수 N의 각 자리가 등차수열을 이루면, 이 N을 한수라고 한다. 이 문제에서는 자연수 N이 주어진다. 그리고 N보다 작거나 같은 한수의 개수를 출력하면 되는 문제이다.

 

우선 10보다 작은 수들을 보겠다. 예를 들어서 1이나 3은 모두 한 자릿수여서 등차수열을 이룬다. 그래서 1부터 9까지는 전부 한수이다.

 

이제 10부터 99까지의 수들을 살펴보겠다. 예를 들어서 10의 각 자리를 보면 0과 1이고 0 - 1 = -1인데 비교 대상이 없으므로 두 자릿수, 즉 10에서 99까지의 수도 한수라는 것이다. 따라서 1부터 99까지는 전부 한수이다. 그래서 입력으로 99보다 작거나 같은 수가 주어지면 그대로 n을 출력해주면 된다.

 

이제 세 자릿수를 봐야 한다. 예를 들어서 100을 보겠다. 각 자리가 등차수열을 이루는지 확인하려면 다음과 같이 하면 된다. 우선 백의 자릿수, 십의 자릿수, 그리고 일의 자릿수를 구한다. 각각 int형 변수 hun, ten, one이라고 하겠다. 이 경우에는 hun = 1, ten = 0, one = 0이다. 그리고 등차수열을 이루려면 ten - hun == one - ten과 같아야 한다. 이 경우 -1 != 0이므로 100은 등차 수열이 아니다.

 

한수인지 아닌지 확인하는 함수를 만들어서 이 문제를 풀 수가 있다. 자세한 코드는 밑에 있다.

 


  • 코드

 

import java.io.*;
import java.util.*;
public class Main {
    static int count;

    public static void main(String[] args) throws IOException {
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        int n = Integer.parseInt(br.readLine());
        if (n <= 99) { //99이하면 모든 자리가 등차수열을 이루므로 한수
            System.out.print(n);
            return;
        }
        count = 99;
        for (int i = 100; i <= n; i++) { //100에서부터 한수인지 아닌지 확인
            d(i);
        }
        System.out.print(count);
    }

    static void d(int n) { //한수인지 확인해주는 함수
        boolean b = true; //true면 한수, false면 한수가 아님
        String s = Integer.toString(n);
        //우선 첫번째와 두번째 자리수의 차이를 구함
        int x = Character.getNumericValue(s.charAt(1)) - Character.getNumericValue(s.charAt(0));
        for (int i = 1; i < s.length() - 1; i++) {
            //두번째와 세번째 자리수의 차이부터 구함
            int c = Character.getNumericValue(s.charAt(i+1)) - Character.getNumericValue(s.charAt(i));
            if (x != c) { //등차수열을 이루지 않으면 b는 false로 바꿈
                b = false;
                break;
            }
        }
        if (b) count++; //한수이면 count + 1
    }
}

 

 

반응형

댓글