[백준] 1065번 한수 C++ 문제 풀이 함수

2019. 9. 3. 21:40알고리즘/백준

728x90
반응형

문제

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

입력

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

출력

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


예제 입력 1

110


예제 출력 1

99


예제 입력 2

1


예제 출력 2

1


예제 입력 3

210


예제 출력 3

105


예제 입력 4

1000


예제 출력 4

144


문제 풀이

#include <iostream>
using namespace std;
bool hansoo(int a){
    if(a < 100)
        return true;
    int a1, a2, a3;
    a3 = a / 100;
    a1 = a % 10;
    a2 = a % 100 / 10;
    if(a3-a2 == a2-a1)
        return true;
    return false;
}
int main(void){
    int N, count = 0;
    cin>>N;
    for(int i =1; i <= N; i++){
        if(hansoo(i))
            count++;
        }
    cout<<count;
}

등차수열은 일정한 값이 한 방향으로 계속해서 증가하거나 감소하는 수열입니다. 

그러므로 모든 두 자릿수는 각 자리수가 등차수열을 이룬다고 볼 수 있으므로 한수이지만 예제 1에서는 110을 입력받고 99를 출력하므로 1부터 99가 모두 한수로 인정됨을 알 수 있습니다.

 

그래서 hansoo 함수에 보면 100미만 자연수는 모두 true를 출력하여 count를 증가시키도록 구현하였습니다.

세 자릿수는 a3에 백의 자리, a2에 십의 자리, a1에 1의 자리를 각각 대입하였고,

 a3-a2, a2-a1은 공차이므로 그 값이 서로 같아야 합니다. 

같지 않으면 등차수열에 해당하지 않으므로 if 문의 조건을 만족하지 못하고 false를 리턴하였습니다.

 

마지막엔 count를 출력하시면 한수의 개수가 출력됩니다.

네 자리수에 대한 조건을 넣지 않았지만 어차피 1000은 false를 리턴하기 때문에 별다른 조건을 넣지 않았습니다.

 

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

 

1065번: 한수

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

www.acmicpc.net

 

728x90
반응형