작성일 :

문제 링크

1065번 - 한수

설명

1 부터 n 까지의 숫자 중에서 한수 인 숫자의 개수를 찾는 문제입니다.

한수 는 각 자릿수의 숫자들이 등차수열을 이루는 숫자를 뜻합니다.


첫 번째로, 1 부터 99 까지의 모든 수는 한수 입니다.

2자리 이하의 숫자에서 각 자릿수의 숫자로 만들어지는 수열은 항상 등차수열이기 때문입니다.

따라서, 주어진 수가 99 이하라면, 주어진 수를 그대로 반환하면 됩니다.


3자리 이상의 숫자에서 각 자릿수의 차이가 동일하다면 해당 숫자는 한수 이므로,

각 자릿수의 차이를 계산하고 그 차이가 동일한지를 검사하여 한수 여부를 알 수 있습니다.


주어진 범위 내에서 완전 탐색 방법으로 한수인지 아닌지를 검사하여 한수의 개수를 출력합니다.


Code

[ C# ]

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
namespace Solution {
  class Program {

    static bool IsHan(int num) {
      var strNum = num.ToString();

      if (strNum.Length <= 2) return true;

      var diff = strNum[1] - strNum[0];
      for (int i = 2; i < strNum.Length; i++) {
        if (strNum[i] - strNum[i - 1] != diff)
          return false;
      }

      return true;
    }

    static void Main(string[] args) {

      var n = int.Parse(Console.ReadLine()!);

      int cnt = 0;
      for (int i = 1; i <= n; i++)
        if (IsHan(i)) cnt++;

      Console.WriteLine(cnt);

    }
  }
}



[ C++ ]

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
#include <bits/stdc++.h>

using namespace std;

bool isHan(int num) {
  string strNum = to_string(num);

  if (strNum.length() <= 2) return true;

  int diff = strNum[1] - strNum[0];
  for (size_t i = 2; i < strNum.length(); i++) {
    if (strNum[i] - strNum[i - 1] != diff)
      return false;
  }

  return true;
}

int main() {
  ios::sync_with_stdio(false);
  cin.tie(nullptr);

  int n; cin >> n;

  int cnt = 0;
  for (int i = 1; i <= n; i++)
    if (isHan(i)) cnt++;

  cout << cnt << "\n";

  return 0;
}