본문 바로가기
백준 알고리즘 단계별 풀이 (문제 수)/함수 (3)

[C++] 한수 판별 : 1065번

by 17번 일개미 2022. 6. 20.
728x90

문제

 

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

입력

 

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

출력

 

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

 


풀이

#include <iostream>
using namespace std;

bool IsHanSoo(int x); // 한수인지 찾는 함수

int main()
{
	int max; int count = 0;
	cin >> max;
	// 입력 수 까지 한수 인지 체크한다
	for (int i = 1; i <= max; i++)
	{
		if (IsHanSoo(i))
		{
			count++; // 숫자 세기
		}
	}
	cout << count; // 센 수 출력
}

bool IsHanSoo(int x)
{
	// 1~99는 무조건 한수 임을 알고있다
	if (x <= 99) return true;
	// 1000은 한수가 아니다
	if (x == 1000) return false;
	// 100~999 까지 한수인지 판별 필요
	while (x != 0)
	{
		int one = x % 10; // 일의 자리
		x /= 10;
		int ten = x % 10; // 십의 자리
		x /= 10;
		int hundred = x % 10; // 백의 자리
		// 백의자리 - 십의자리 와 십의자리 - 일의자리 가 같으면
		if ((hundred - ten) == (ten - one))
		{
			return true; // 한수이다
		}
	}
	return false; // Default 는 한수가 아니다
}

 

1. 주어진 조건에 따라 한수라는 것은 100 ~ 999까지만 판별하면 된다는 것을 알 수 있다.

 - 1~99 는 무조건 한수가 되고, 최대입력은 1000이지만, 1000은 한수가 아니다.

 

2. 따라서, 우리는 가장 많이 계산해야하는 공통적인 범위 100~999까지의 코드를 짠다.

 

3. 어떤 수 X를 10으로 모듈러연산(%)하면서 일의 자리, 십의 자리, 백의 자리를 추출해낸다.

 

4. 각 자리 수 끼리의 '차'가 같다면 그 수는 한수이다.

 

5. 따라서 바로 True 를 return 하며 함수를 종료한다.

728x90