학습 정리/👨‍💻 PS Study

[C] 백준 1065번 - 한수

무딘붓 2022. 6. 22. 22:46

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

 

1065번: 한수

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

www.acmicpc.net

1065번: 한수 - C언어 풀이

[문제]

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

[입력]

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

110
210
1000

[출력]

첫째 줄에 1보다 크거나 같고, N보다 작거나 같은 한수의 개수를 출력한다.

99
105
144

[소스코드]

#include <stdio.h>
// [baekjoon] 1065번 - 한수

int hansu(int n) {
	int arr[4] = { 0 };
	int i = 0;
	while (n > 0) {			// 입력받은 숫자의 각 자리수를 배열에 대입
		arr[i] = n % 10;
		n /= 10;
		i++;
	}

	switch (i) {
	case 1: case 2:	// 2자리수 이하일때는 무조건 한수
		return 1;	// 한수이면 1 반환
	case 3:			// 3자리수 일때 한수여부 판단
		if (arr[1] - arr[0] == arr[2] - arr[1]) return 1;	// 각 자리수의 차가 같으면 1 반환 (한수)
		else return 0;										// 같지 않으면 0 반환 (한수x)
	default:		// 4자리수 (=1000)일때는 한수가 아님
		return 0;	// 한수가 아니면 1 반환
	}
}

int main() {	

	int n, sum = 0;
	scanf("%d", &n);

	for (int i = 1; i <= n; i++) {
		sum += hansu(i);
	}

	printf("%d\n", sum);
	
}

문제에서 중요한 건 '한수'가 무엇인지 파악하는 건데,

한수는 각 자리가 등차수열을 이루는 수, 즉 각 자리수들의 차가 일정한 차이를 보이는 수다.

문제만 읽고 나면 한 자릿수, 두 자릿수는 어떻게 되나 알기 어려웠는데,

한 자릿수와 두 자릿수는 모두 한수이다.

입출력 예시에서 110을 입력했을 때 99가 나오는 것을 보면 확인할 수 있다. (101~110에는 한수가 없으니까)

입력받을 자연수의 최댓값은 1000인데, 1000은 한수가 아니므로

결과적으로 세 자릿수만 한수인지 판별하는 코드를 작성하면 된다.

정수를 받아서 한수 여부를 판별하는 함수 hansu를 만들어서 문제를 해결해봤다.

정수를 자리수 별로 분리해서 배열 arr에 저장했고, 나눈 횟수를 통해 해당 정수의 자리수도 확인했다.

작성한 코드는 영 깔끔하지 못하다.

case 문을 써보고 싶어서 썼는데, if 문으로 작성해도 충분해 보인다.