[백준] 알고리즘 1065. 한수
문제
어떤 양의 정수 X의 각 자리가 등차수열을 이룬다면, 그 수를 한수라고 한다. 등차수열은 연속된 두 개의 수의 차이가 일정한 수열을 말한다. N이 주어졌을 때, 1보다 크거나 같고, N보다 작거나 같은 한수의 개수를 출력하는 프로그램을 작성하시오.
입력
첫째 줄에 1,000보다 작거나 같은 자연수 N이 주어진다.
출력
첫째 줄에 1보다 크거나 같고, N보다 작거나 같은 한수의 개수를 출력한다.
예제 입력
110
예제 출력
99
예제 입력
1
예제 출력
1
예제 입력
210
예제 출력
105
예제 입력
1000
예제 출력
144
#include <iostream>
#include <vector>
using namespace std;
int dgtSequence(int n) {
if (n == 1000) return 0;
vector<int> dgtArr; // n을 자리별로 나누어 넣을 벡터
int dgt;
while (n != 0) {
dgt = n % 10;
dgtArr.push_back(dgt);
n /= 10;
}
int k = 0;
int diff1, diff2 = 0;
if (dgtArr.size() == 3) { // 세 자릿수인 경우
diff1 = dgtArr[0] - dgtArr[1];
diff2 = dgtArr[1] - dgtArr[2];
if (diff1 == diff2)
return 1;
else
return 0;
}
else // 세 자릿수 미만인 경우
return 1;
}
풀이
이 문제도 로직은 매우 쉽습니다. 우선 1부터 99까지는 전부 항이 1개 혹은 2개이기 때문에 전부 한수입니다. 그래서 99개가 나오는 것이죠.
100부터 999까지는 저는 단순하게 index 이용해 (백의 자리 - 십의 자리) 가 (십의 자리 - 일의 자리) 와 동일한지 여부로 카운트 했습니다. 1000은 한수가 아니므로 바로 리턴합니다.