본문 바로가기

Programming/백준 문제풀이

백준 1065 한수_ 함수(function)사용! (C++)

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

 

1065번: 한수

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

www.acmicpc.net

이 문제는 사실 굉장히 간단한 문제이면서, 동시에 함수를 연습해보기 좋은 문제이다.
문제의 핵심은 간단하다.

99까지는 모든 숫자들이 각 자릿수끼리 등차수열을 이룬다. (비교군이 없기 때문이다.)
1의 자리나 10의 자리까지 구현하려다보면 복잡해질 수 있지만 1-99면 그냥 그 숫자를 리턴하게 만들어준다. (편-----안)
하지만 100, 즉 세자리수부터 각 연속된 자리수끼리 빼준 값들이 같을 때만 counter를 1씩 늘려주면 된다.

이건 진짜 클래스 개념을 쓸 필요 없는데... 그냥 요즘 객체지향에 푹 빠져서 한번 그렇게 만들어보았다.

#include <iostream>
using namespace std;

class One{
private:
    const int x;
public:
    One(int a): x(a) {}
    int Onehandler(); //100의 자리 이상 수의 한수를 count해준다.
    int numOne(); //99까지는 그냥 수를 리턴하고 100부터는 Onehandler에 99를 더해 리턴한다.
};

int main(){
    int a;
    cin>>a;
    One Q1(a);
    cout<<Q1.numOne();
    return 0;
}

int One::Onehandler(){
    int counter=0;
    for(int i=100; i<=x; i++){
        int _00 = i/100;
        int _0 = (i-(_00*100))/10;
        int _ = i-((_00*100)+(_0*10));
        if((_00-_0)==_0-_){
            counter+=1;
        }
    }
    return counter;
}

int One::numOne(){
    if(x<100){return x;}
    else{return 99+Onehandler();}
}

끝!