초보 개발자의 이야기, 릿허브

[C] 백준 1065번 한수 본문

코딩테스트/📗 백준 (BOJ)

[C] 백준 1065번 한수

릿99 2021. 8. 6. 15:36
728x90
반응형
1. 문제이해

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

 

1065번: 한수

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

www.acmicpc.net

 

자연수 N의 각 자릿수가 등차수열을 이루는 수를 한수라고 한다.

N을 입력받고, 1부터 N까지의 한수의 개수를 출력하는 알고리즘을 구현하는 것이 목표이다.

 

 

 

2. 문제풀이

 

1부터 입력받은 N까지의 자연수 중 한수의 개수를 출력하는 문제이다. (N은 1000이하의 자연수이다.)

각 자릿수가 서로 등차수열을 이루어야 하기 때문에,

백의자리, 십의자리, 일의자리 숫자를 각각 비교해주었다.

 

예를 들어, 123의 경우

1과 2의 차가 1, 2와 3의 차가 1이므로

공차가 1인 등차수열을 이루는 한수이다.

 

472같은 경우에는

4와 7의 차가 -3, 7과 2의 차가 5이므로,

등차수열이 아니므로 한수가 아니다.

 

한자리, 두자리 숫자같은 경우에는 그 자체로 등차수열을 이루기 때문에 한수로 취한다.

(72같은 경우 공차가 5인 등차수열로 취급한다.)

 

 

 

3. 소스코드
#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>

//등차수열을 이루는지 검사
int AP(int a, int b, int c) {
	return ((a - b) == (b - c)) ? 1 : 0;
}

int main() {
	// N은 1000보다 작거나 같은 자연수
	int N;
	int a, b, c = 0;
	int count = 0;
	int i;

	scanf("%d", &N);

	if (N < 100) {
		printf("%d", N);
	}
	else {
		for (i = 100; i <= N; i++) {
			a = i / 100;	// 100의 자리
			b = i / 10 % 10;	// 10의 자리
			c = i % 10;	// 1의 자리

			if (AP(a, b, c) == 1) {
				count++;
			}
		}
		// 100미만의 숫자들은 모두 한수
		printf("%d", count + 99);
	}
	return 0;
}

메인 함수에서 N을 입력받고, N이 100미만의 수 (두자리, 한자리 자연수)일 경우에는

모든 수가 한수이므로,  N을 그대로 출력해주었다.

 

N이 100이상의 수(세자리 자연수)면,

100부터 N까지의 자연수들을 각각 100의 자리, 10의 자리, 1의 자리숫자로 분해하여

등차수열을 이루는지, 즉, 한수인지를 판단하고, 한수이면 count 해주었다.

 

등차수열을 이루는지에 대한 확인은 함수로 따로 구현해주었는데,

등차수열이면 1, 아니면 0을 반환하도록 했다.

마지막 출력부분에서, 100미만의 숫자들은 모두 한수이므로,

count한 한수의 갯수에 99를 더해주었다.

 

 


한수라는 말은 사실 오늘 처음 들어봤는데, 이런 개념도 있구나~ 하고 하나 배운것같다.

내일이면 주말이고, 다음주에는 휴가니까..

내일까지 포스팅하고 며칠 쉬다 와야겠다.

쉬고 와서는 더 빡센 문제로 더 빡세게 공부해야지!😊

 

 

 

728x90
반응형