본문 바로가기
study/CodingTest

백준 1065 한수 (Java) - 로지컬한 케이스 분리는 언제나 중요하다

by 고기만두(개발자) 2021. 11. 10. 22:10
728x90
반응형

문제

어떤 양의 정수 X의 각 자리가 등차수열을 이룬다면, 그 수를 한수라고 한다.

등차수열은 연속된 두 개의 수의 차이가 일정한 수열을 말한다.

N이 주어졌을 때, 1보다 크거나 같고, N보다 작거나 같은 한수의 개수를 출력하는 프로그램을 작성하시오.

 

입력

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

출력

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


1보다 크거나 같고, 입력받은 수 자기 자신까지

정수 각 자리가 등차수열을 이루는 숫자를 체크하는데

 

1의자리, 10의자리 숫자는 당연히 여기에 모두 포함된다.

뺄 게 어딨다고?

 

그리고 1000의 경우에는 함정카드다.

1-0 = 1 , 0-0=0 으로 등차수열이 성립하지 않는다.

그러니 사실상 100부터 999까지라고 봐도 무방한데, 출제자가 의도한 건지 모르겠네.

 

1부터 99까지가 입력되면 그냥 입력받은 자신을 뱉어내게 한다.

1000이 들어오면 999 입력과 동일하게 간주하여, 세자리 수 입력시의 반복문을 태운다.

세자리수 입력됐으면 반복문 태운다.

 

백의 자리 수 a = 입력받은수 / 100 해서 int 자료형이므로 몫만 살린다.

일의 자리 수 c = 입력받은수 % 10, 즉 10으로 나눈 나머지

 

십의 자리 수가 문제가 되는데 사실 차분히 생각해보면 어렵지 않다.

입력받은 수를 10으로 나누면 일의자리 나머지가 버려진다.

그 10으로 나눈 수를 10으로 나눈 나머지가 구하는 십의자리 수가 된다.

ex ) 324 / 10 = 32 -> 32 % 10 = 2

 

그리고 (백의자리수 - 십의자리수) == (십의자리수 - 일의자리수) 이면 성공

 

 

import java.io.*;

public class Main{
    public static void main(String[] args) throws IOException{
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        
        int i = Integer.parseInt(br.readLine());
        br.close();
        System.out.print(chkFunction(i));        
    }
    
    public static int chkFunction(int number){
        int cnt = 0;
        int a = 0;
        int b = 0;
        int c = 0;
                
        if(number >= 1 && number <= 99){
            cnt = number;    //두자리수까지는 계산할 필요 없음 뺄셈 하나만 하면 되어 무조건임
        } else {    //세자리수 입력들어오는 경우
            cnt =99;    //99개를 일단 깔고
            
            if(number == 1000){
                number = 999;    //1000은 누가봐도 계산할 필요 없어보임 - 999까지니까 999로 계산가능
            } 
            
            for(int i = 100; i <= number ; i++){    //100부터 입력받은 백의자리 숫자까지
                a = i / 100;    //백으로 나눈 몫이 백의자리
                b = (i / 10) % 10;    //십으로 나누어서 일의자리 떨고, 그걸 10으로 나눈 나머지가 십의자리
                c = i % 10;    //십으로 나누고 남은 일의자리
                    
                if((a-b) == (b-c)){    //백-십 == 십-일인 수는 조건 충족
                    cnt++;
                }
            }
        }
        
        return cnt;
        
    }
}

한수라는 말이 좀 이상하지만 정의가 명쾌하게 주어져 있으니

자릿수 쪼개는거랑 케이스 분리만 잘하면 어렵지 않은 문제

실버4 티어지만 뭐 딱히.. 그 값을 하는진 잘 모르겠더라는

728x90
반응형

댓글