#45. 백준 1065번 문제 풀이: 한수 문제 원본 보기
양의 정수 X의 각 자리가 등차수열을 이룬다면, 그 수를 한수라 한다. N 이 주어졌을 때 1 보다 크가 N이하인 한수의 개수를 출력하시오. 입력: 1,000 이하의 자연수 N 출력: N 이하 한수의 개수
입력/출력
--입력--
110
--출력--
99
문제풀이+해설
한수를 체크하는 함수를 만들고, 루프를 돌려서 한수체크 함수를 불러 한수의 개수를 계산한다.
일단 1 부터 99 까지는 모두 등차수열이다.
그러므로 100 부터 제한값인 999까지만 체크하면 된다.

등차수열임을 계산하는 함수는 아래와 같이 작성할 수 있다.
 1) 1의 자리수와 10의 자리수의 간격을 구한다.
 2) 10의 자리수와 100의 자리수의 간격을 구한다.
 3) 두 간격이 같으면 등차 수열이다.
99 보다 큰 수의 등차수열 개수는 위 함수를 루프로 돌려서 카운트하면 된다.
code sol.
#include <iostream>
using namespace std;
// 한수인지 체크하는 함수
int hansu(int n) { // n: 확인할 숫자, 리턴: 한수이면 1, 아니면 0
  int n2, d;
  if(n < 100) return 1; // 1~99는 모두 등차수열
  n2 = n / 10; // 끝자리 없앰
  d = n%10 - n2%10; // 1의 자리수-10의 자리수=간격
  while(n2 > 9) { // 마지막 한 자리수 이미 계산 끝난 상태므로 루프 끝 
    if(d != (n2%10 - (n2/10)%10)) return 0;
    // 앞을 자리수 뺀값이 기존 간격과 다르면 한수가 아님. 리턴 0 끝.
    n2 = n2 / 10; // 끝자리 없앰
  }
  return 1; // 간격이 모두 같으므로 한수. True 리턴
}

int main() {
  int i, n, count = 0;
  cin >> n; // 숫자를 입력받아 정수로 만들어 대입한다. 최대값 n
  count = 99; // 99까지는 모두가 등차수열임
  if(n < 99) { // 99보다 작으면 그 값이 등차수열 갯수
    count = n;
  } else { // 99보다 크면 100 이상 숫자부터 그 값까지 한수 계산
    for(i = 100; i < n+1; i++) {
      if(hansu(i)==1) count++; // 한수이면 카운트 증가
    }
  }
  cout << count; // 한수의 총갯수 count 출력
  return  0;
}
© 코드솔 - CodeSol. All Rights Reserved.