코딩/백준 알고리즘

백준 1065-한수(C언어)

lee1201zxc 2022. 5. 26. 05:38
300x250

문제 링크 : https://www.acmicpc.net/problem/1065

 

1065번: 한수

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

www.acmicpc.net

 

문제 

 

 

 

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

 

 

 

 

 

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

 

 

출력

 

 

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

 

 

예제 입력 1

110

 

예제 출력 1

99

 

해설

 

등차수열은 "연속된 두 개의 수의 차이가 일정한 수열을 말한다"

이 부분을 구현하면 된다. 

이 문제에서 주의해야 할 점이 한 자릿수, 두 자릿수 모두 한수이다. 

 

한 자릿수가 한수인 이유는 예를 들어보자면 '7, 7, 7, 7, 7...'이라는 수열이 있다면

이 수열의 초항(첫째 항)은 7이고 공차(두 항의 차이)는 0인 등차수열이다.

한 자릿수는 위와 같은 등차수열의 첫째 항이라고 생각하면 된다.

 

두 자릿수는 길이가 2이고 공차는 (십의 자리-일의 자리)인 등차수열이다.

 

세 자릿수는 각 자리를 비교하여 한수인지 판단한다.

 

코드

#include<stdio.h>
int main(void)
{
	int n,a=0;
	scanf("%d",&n);
	for(int i=1; i<=n; i++)
	{
		if(i<100)
			a++;
		else
		{
			if(i/100-(i%100/10)==(i%100/10)-i%10)
				a++;
		}
	}
	printf("%d",a);
}

1~99는 모두 한수이고(8~9행)

세 자릿수는 백의 자리와 십의 자리의 차이, 십의 자리와 일의 자리의 차이를 구하여 같으면 한수이다.(10~14행)

(i/100)->백의 자리, (i%100/10)->십의 자리, (i%10)->일의 자리

네 자릿수는 1000 하나뿐인데 한수가 아니므로 굳이 안 구해도 된다.

 

728x90