[C++] BOJ #1065 한수

Posted on 2022. 01. 25


문제

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

입력

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

출력

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

해결방법 및 소스코드

Brute Force 방식으로 해결하였다.

  • 1부터 99까지는 모두 다 한수임을 이용하면 쉽다.
  • 100부터는 등차수열의 특성인 등차중항을 이용하면 쉽게 해결할 수 있다.
  • 입력이 1000보다 작은 수이므로, 1000에 대해서는 따로 예외처리를 하면 된다.
    (999를 넣었을 때랑 같은 값이 나오게 하면 됨)
#include <iostream> using namespace std; int countHansoo(int &N, int &cnt) { //100 이상이므로 한수는 최소 99개부터 시작이다. cnt = 99; for (int i = 100; i <= N; i++) { int a, b, c; int temp = i; c = temp % 10; temp /= 10; b = temp % 10; temp /= 10; a = temp % 10; if (2 * b == a + c) { cnt++; } } return cnt; } int main() { int N; int count = 0; cin >> N; //100 미만의 모든 수가 한수임 if (N < 100) { count = N; } //100 이상부터는 따로 계산해줘야함. else if (N < 1000) { count = countHansoo(N, count); } else { count = 144; } cout << count << endl; }