티스토리 뷰

728x90
반응형

백준 온라인 저지(BOJ) 1065번 한수

https://www.acmicpc.net/problem/1065

 

1065번: 한수

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

www.acmicpc.net

* 사용언어 : C언어, C++

 

1. 문제

어떤 양의 정수 X의 각 자리수가 등차수열을 이루면 그 수를 한수라고 함
입력 N에 대해서 1보다 크거나 같고 N보다 작거나 같은 한수의 개수를 출력
(1 ≤ N ≤ 1000)

 

2. 풀이

우선 한수에 대해 생각해보겠습니다.
한수가 되려면 각 자리수가 등차수열을 이뤄야 합니다.

예를 들어 147이라는 수를 생각해보면,
1, 4, 7 세 숫자가 공차가 3인 등차수열이 되므로 147은 한수가 됩니다.
그 밖에 123, 246, 852 ... 과 같은 숫자들도 한수겠죠.

그렇다면 등차수열이 성립하지 않는 1자리 or 2자리 숫자는 어떻게 봐야 할까요?

이는 문제의 입, 출력 예시로 생각해보았습니다.

문제의 첫 번째 예제에서 입력은 110이고 출력은 99입니다.
여기서 100 부터 110 까지 숫자 중에 한수는 없습니다.
즉, 1부터 99까지를 모두 한수로 본 것입니다.

그런 이유로 저는 한수를 확인하는 함수(chk(int n))를 만들 때,
함수의 매개변수는 모두 3자리 숫자라고 가정하고 코딩했습니다.

모든 자리수에 대해 가능하도록 일반화하여 코딩할 수도 있겠지만,
가성비가 안나와서 그냥 이 문제에 맞게 간단하게 풀었습니다.

풀이에 비해 코드는 간단하니 코드 설명은 생략하겠습니다.

 

3. 코드

#include <stdio.h>

int chk(int n) {
	int n1 = n % 10;
	int n2 = n / 10 % 10;
	int n3 = n / 100 % 10;

	if (n2 * 2 == n1 + n3) return 1;
	return 0;
}

int main() {
	int n;
	scanf("%d\n", &n);

	int ret;
	if (n < 100) ret = n;
	else {
		ret = 99;
		if (n == 1000) n = 999;
		for (int i = 100; i <= n; ++i) {
			ret += chk(i);
		}
	}

	printf("%d\n", ret);
	return 0;
}

* 한수가 아닌 1000 이 chk 함수에서는 한수로 처리되므로 999 로 변경했습니다.
* 3자리 인지 확인(if (n < 1000))을 반복하지 않도록 for 문 밖에서 처리했습니다.

728x90
반응형
댓글