본문 바로가기

코딩/백준 BOJ

[백준/C언어] 1065번 - 한수

백준 웹사이트 "1065번 - 한수" 문제풀이입니다.

언어는 C언어입니다. (제출 언어: C99)

 


문제

 

1065번: 한수

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

www.acmicpc.net


소스 코드

#include <stdio.h>
#include <stdbool.h>

// 1. 한수를 판별하는 함수
bool hansu(int n){
    if(n<10){
        return true;
    }
    else{
        int common_diff = (n/10)%10 - n%10;
        while(n/10>0){
            int digit_diff = (n/10)%10 - n%10;
            if(common_diff!=digit_diff)
                return false;
            n = n/10;
        }
        return true;
    }
}

// 2. 1~N 까지의 수 중, 한수의 개수를 구한다.
int main(void){
    int N;
    scanf("%d", &N);

    int counter = 0;
    for(int i=1; i<=N; i++){
        if(hansu(i))
            counter++;
    }
    printf("%d\n", counter);
}

문제 풀이

  풀이는 두 섹션으로 나뉩니다: 한수를 판별하는 함수를 만들고, 이를 이용해 한수의 개수를 구합니다.

 

1. 한수를 판별하는 함수를 만듭니다.

  Line 5 ~ 19은 입력된 정수 n이 한수인지 아닌지 판별하는 함수입니다. 반환 자료형(return type)이 'bool'인데, 4673번에 설명했다시피 true/false에 해당하는 boolean은 원래 C언어에 존재하지 않습니다. 하지만 C99에서는 <stdbool.h> 헤더파일을 추가해줌으로써 이용할 수 있습니다. 이 문제의 경우, 입력값이 한수일 경우 true, 한수가 아닐 경우 false가 반환되도록 하고 싶기에 반환 자료형 'bool'로 선언합니다.

  이제 함수 자체를 보겠습니다. n이 10보다 작을 경우, 항상 한수이므로 'true'가 반환되도록 합니다. 그렇지 않을 경우, 자릿수들을 비교해야 합니다. Line 10의 'common_diff'는 '(십의 자리) - (일의 자리)'로, '공차'를 의미합니다. 연속된 자릿수들의 차가 모두 이 공차와 동일하면 한수이므로, Line 11 ~ 16의 while문을 통해 이를 확인합니다. 한수가 아님이 판별나면 'false'가 반환되고, while문을 빠져나오면 'true'가 반환됩니다.

  아래는 백준 웹사이트 "4673번 - 셀프 넘버" 문제풀이 링크입니다.

 

[백준/C언어] 4673번 - 셀프 넘버

백준 웹사이트 "4673번 - 셀프 넘버" 문제풀이입니다. 언어는 C언어입니다. (제출 언어: C99) 문제 4673번: 셀프 넘버 셀프 넘버는 1949년 인도 수학자 D.R. Kaprekar가 이름 붙였다. 양의 정수 n에 대해서

loding.tistory.com

 

2. 1 ~ N 까지의 수 중, 한수의 개수를 구합니다.

  위에 작성한 함수를 이용하는 단계입니다. 입력된 정수 N에 대해, N보다 작거나 같은 자연수 중 한수를 구합니다. Line 27의 for문을 통해 수를 하나씩 확인하면, 최종적으로 'counter'에 총 한수의 개수가 저장됩니다.

반응형