coding_test/BAEKJOON

백준 1065번 C언어 풀이

CodeJin 2021. 8. 6. 16:11

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

 

1065번: 한수

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

www.acmicpc.net

각 자리수가 등차수열을 이루는 한수에 관한 문제.

 

무작정 판단하기 보다는 숫자 범위를 정하여 한수를 판단했다.

 

일단 100미만의 자연수는 무조건 등차수열이 될 수 밖에 없다. (동시에 등비수열도 가능하겠다.) 그러므로 100미만의 값이 들어오는 경우는 그 숫자만큼 한수가 존재하므로 이때는 그 수를 return하면 된다.

 

세자리수중에서 100~110의 범위에서도 한수는 없다. 어떤 방식으로 해도 등차수열이 될 수 없기 때문이다.

 

즉, 진짜로 공차를 따져야 하는 것은, 111부터 따지면 되는 것이다.

 

이를 구현하면 다음과 같다 

#include <stdio.h>

int hansu (int num) {
    int cnt = 0;
    int a, b, c;

    if (num < 100) { // 100미만의 자연수는 무조건 한수
        cnt = num;
    } else if (num >= 100 && num <= 110){// 100 ~ 110사이에 한수는 없다.
        cnt += 99;
    } else {
        cnt += 99;
        for (int i = 111; i <= num; i++) { 
            if (i == 1000) { // 1000은 한수가 아니기 때문에 따지지 않는다.
                break;
            }
            a = i / 100;
            b = (i / 10) % 10;
            c = i % 10;

            if ((a - b) == (b - c)) {
                cnt++;
            }
        }
    }

    return cnt;
}

int main(){
    int N;

    scanf("%d", &N);
    printf("%d", hansu(N));

    return 0;
}