카테고리 없음

[백준] 한수

Dev_Cat 2023. 6. 25. 15:27
728x90
반응형

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

 

1065번: 한수

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

www.acmicpc.net

문제에서 N은 1000이하 수다. 나는 1000 이상의 수에 대해서도 한수를 찾을 수 있게 string을 이용해 문제를 풀었다.

문제에 접근하기 전 N을 100 미만일때와 이상일때로 나눈다. 즉 N의 자리수가 2자리냐 3자리 이상이냐에 따라 문제를 접근한다.

 

해설

1) N이 100 미만일때 한수는 입력으로 들어온 수 N만큼 있다.

ex) N이 80이면 한수는 80개다.

 

2) N이 100 이상일때 한수는 각 자리수를 비교해 찾는다. 즉 각 자리수 값의 차를 비교하여 같으면 한수로 취급한다.

ex) 101이의 경우 각 자리수를 가져와 비교한다. 즉 백의 자리 = 1, 십의 자리 =  0, 일의 자리 = 1로 (백의 자리 - 십의  자리)와 (십의 자리 - 일의 자리) 의 값을 비교해 같다면 한수다.

 

풀이 코드

#include<iostream>
#include<vector>
#include<algorithm>
#include<string>

#define FastIO ios::sync_with_stdio(false); std::cin.tie(NULL); std::cout.tie(NULL);

using namespace std;

int main(void)
{
	FastIO;
	
	string input;
	std::cin >> input;

	int n = std::stoi(input);

	int result = 99; //100 이상부터 최소 한수는 99개다.
	for(int i = 100; i <= n; i++)
	{
		string temp = std::to_string(i);
		bool isHanso = true;
		for(int j = 1; j < temp.size() - 1; j++)
		{
			if(temp[j] - temp[j-1] != temp[j+1] - temp[j])
			{
				isHanso = false;
			}
		}
		if(isHanso)
		{
			result ++;
		}
	}

	if(n < 100)
	{
		std::cout << n << "\n";
		return 0;
	}
	std::cout << result << "\n";
	return 0;
}
728x90
반응형