Dev2yup의 프로그래밍 이야기 🖥 💻

C

[5] 백준 1065번 한수의 개수 출력

엽동이 2022. 6. 20. 01:21

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

 

입력

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

출력

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

 나의 풀이

#include <stdio.h>

int hansu(int);
int main(void){
    int input, i, result, count = 0;

    scanf("%d", &input);
    for (i = 1; i <= input; i++)
    {
        result = hansu(i);
        result == 1 ? count++ : 0;
    }
    printf("%d", count);
    return 0;
}

int hansu(int i)
{
    int a, b, c;
    if (i < 100)
        return 1;
    else{
        a = i / 100; // 100의 자리
        i %= 100;
        b = i / 10; // 10의 자리
        i %= 10; // 1의 자리
        c = i;
        if ((c - b) == (b - a)) // 각 수가 등차수열을 이룰 때
            return 1;
        else
            return 0;
    }
}

 

다른 사람의 풀이 (재귀함수 이용)

#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>

int n, cnt=0;
int hansu(int n) {
	if(n < 100){ // 100 미만은 한수
        cnt++;
        if(n == 1) // 100 미만 중에서 1이 됐을 때 재귀 종료
            return cnt;
    }
    //100이상은 자릿값 검사
	else {
		int d = n%10 - n/10%10; // 일의 자리에서 십의 자리를 뺀 값(특정 자리 - 바로 앞 자리)로 기준 공차 설정
        for(int num = n/10; num >= 10; num /= 10){ 
            // 초기 값을 입력값/10으로 설정해서 "특정 자리"를 십의 자리부터 시작, 한 자리씩 앞으로
            // 가장 앞의 두 자리만 남을 때까지 반복
            if(num%10-num/10%10 != d){ // 공차가 일정하지 않은 경우 1 줄이고 반복 중단
                --cnt;
                break;
            }
        }
        ++cnt; // 등차수열을 이룬다면 반복 도중 -1이 되지 않으므로 +1, 위배된다면 +0
	}
	return hansu(n-1);
}

int main() {
	scanf("%d", &n);
	printf("%d", hansu(n));

	return 0;
}