[알고리즘] 백준 1065 - 한수

홍예주·2022년 9월 22일
0

알고리즘

목록 보기
77/92

1. 문제

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

2. 입력

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

3. 풀이

3가지 경우로 나누어서 생각한다.

1. n이 1~99사이 숫자일 때(두자리수)

-> n만큼의 한수가 존재

if (n >= 1 && n <= 99) {
	cout << n;
}

2. n이 1000일 때

-> 144개의 한수 존재(예제 참조)

else if(n==1000){
	cout << 144;
}

3. n이 100~999일 때(세자리수)

-> 100부터 n까지의 숫자를 모두 검증해야 함
세자리수인 것을 알기 때문에, 3칸 크기의 배열을 만들어서 각 자리 수를 파싱해서 넣는다.
그리고 1,2번째 자리 숫자의 차이와 2,3번쨰 자리 숫자의 차이를 비교한다.

4. 코드


bool cal(int n) {
	int arr[4] = { -1, };

	int dif = 100000;

	for (int i = 0; i < 4; i++) {
		if (n == 0) break;
		arr[i] = n % 10;
		n = n / 10;
	}


	dif = arr[1] - arr[0];
	if (dif != arr[2] - arr[1]) return false;
	else return true;

}

int main()
{
	cin.tie(0);
	cout.tie(0);
	cin.sync_with_stdio(0);

	int n;
	cin >> n;

	if (n >= 1 && n <= 99) {
		cout << n;
	}
	else if(n==1000){
		cout << 144;
	}
	else {
		int total = 99;
		for (int i = 100; i <= n; i++) {
			if (cal(i)) {
				total++;
			}
		}

		cout << total;
	}

}
profile
기록용.

0개의 댓글