관리 메뉴

사과하는 제라스

[백준 BOJ 1065번] 한수 본문

JAVA 백준 알고리즘 문제풀이/함수

[백준 BOJ 1065번] 한수

Xerath(제라스) 2021. 10. 15. 21:41

목차

    728x90
    반응형

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

     

    1065번: 한수

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

    www.acmicpc.net

     

    1. 문제

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


    2. 입력

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

    110
    1
    210
    1000

    3. 출력

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

    99
    1
    105
    144

    4. 풀이

    일단 한수라는 기준이 정확히 어떤지 확인을 해본다. 주어진 입출력 내용으로 보아 1. 한자리 숫자는 모두 한수이다.

    또한 2. 두자리 숫자는 차이가 몇이 나든 다른 것들과 비교할 것이 없으니 무조건 한수이다. 즉 1~99까지는 모두 한수인 것이다. 그렇다면 고려할 부분은 오직 3. 세자리 숫자인데... < 100의자리 -10의 자리 == 10의 자리 - 1의 자리 > 이 조건만 성립하는 숫자들이다. 

     

    먼저, BufferedReader로 String형 숫자를 N에 받아오고 이를 따로 정수형으로 int_N에 넣어준다. 여기서 N은 N.length()를 활용하여 숫자의 길이를 측정하고자 받아온 것이지만 사실 int_N만을 이용해서 크기 비교문을 만들 수 있긴 하다. 

     

    이후, length() 함수를 활용하여 받아온 숫자가 몇자리 숫자인지 판단하고 각 길이에 따라 수행문을 달리 한다.

     

    한자리 -> 그 숫자까지가 모두 한수

    두자리 -> 그 숫자까지가 모두 한수

    세자리 -> 99까지는 모두 한수 + 100부터는 < 100의자리 -10의 자리 == 10의 자리 - 1의 자리 > 조건 성립 여부에 따라 한수

     

    이때 < 100의자리 -10의 자리 == 10의 자리 - 1의 자리 > 조건 성립에 대해 확인하는 함수를 compare함수로 두었다.

    compare 함수는 받아온 값에 대해 < 100의자리 -10의 자리 == 10의 자리 - 1의 자리 >의 성립 여부(T/F)를 리턴해준다.


    5. 소스코드

    import java.io.*;
    
    class Main{
        public static void main(String [] args) throws IOException {
            BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
            String N = br.readLine();
            int int_N = Integer.parseInt(N);
    
            int count = 0;
    
            if(N.length() == 1 || N.length() == 2){
                count = int_N;
            }
    
            else{
                count = 99;
                for(int i=100; i<=int_N; i++){
                    if(compare(i)) count += 1;
                }
            }
    
            System.out.println(count);
    
        }
    
        public static boolean compare(int a){
            return(a/100 - (a%100)/10 == (a%100)/10 - (a%10));
        }
    }

    6. 배운 것

    자릿수 사이의 크기 혹은 차이 비교 시 %10, /10 등을 잘 사용하지 않으려 했으나 오히려 더 간단하게 사용할 수도 있음을 알 수 있었다. 처음 코드에선 받아온 값에 대해 charAt을 이용하여 2 자릿수에 대한 차이를 확인하려 했으나 이 또한 식이 길어질 수 있음을 알게 되었다. 다음 번에는 3자리보다 긴 문제 해결에서는 한번 for문을 활용하여 %10, /10 의 사칙연산을 적극 활용해보아야겠다.

     

     

    728x90
    반응형