백준 algorithm

백준 1065 - 한수

cosmohoo 2019. 9. 2. 00:56
반응형

문제설명

아침에 일어나자마자 풀어본 문제이다. 친구는 쉽게 푼 문제이지만 나에겐 시간이 필요했다. 
우선 등차 수열에 대한 개념을 정확히 하고 가야 했다.
등차수열 : 연속하는 두 항의 차이가 모두 일정한 수열을 뜻한다. 

 

수열 - 위키백과, 우리 모두의 백과사전

위키백과, 우리 모두의 백과사전. 수학에서, 수열(數列) 또는 열(列, sequence)은 수 또는 다른 대상의 순서있는 나열이다.[1] 나열 순서를 생각해야 하고 중복이 허용된다는 점에서 집합과 구분된다. 양의 홀수의 크기 순 나열 1, 3, 5, 7, ...은 수열의 예이다. 수열은 자연수의 집합에 정의된 함수라고 할 수 있다. 수열의 항[편집] 수열을 이루는 구성원을 수열의 항(term) 또는 원소(element)라고 한다. 수열은 항의 유형에 따라

ko.wikipedia.org

여기서 한수는 자리수들이 서로 등차수열을 이룰 때, 그 해당하는 숫자를 한수라고 한다. 

ex)123: 1 2 3 => 2(두번째 항)-1(첫번째 항)= 3(3번째 항)-(2번째 항)이므로 한수에 해당한다.

0~99까지의 숫자까지는 항이 두개이므로 모든 숫자 자신이 한수에 해당한다. 

100부터의 숫자는 위의 조건을 만족하는 갯수를 카운트하여 알려줘야한다.

 

등차수열을 확인하기 위해서는 각자리 숫자를 분열하여야한다. 
100의 자리 : number/ 100
10의 자리 : (number / 10) % 10
1의 자리 : number % 10

위와 같이 각 자리 숫자를 나누면 조건에 합당하는지 확인할 수 있다. 
위의 방법으로 분열한 숫자들을 배열속에 넣고 연속하는 배열의 수들의 크기 차이가 동등한지 확인하여 카운트 갯수를 늘린다. 

 

#include <iostream>

using namespace std;

int method(int number)
{
	int DP[3] = { 0 };
	int value = 99;
	if (number <= 99)
	{
		value = number;
	}
	else if (99 < number)
	{
		for (int i = 100; i <= number; i++)
		{
			DP[0] = i / 100; //100의자리숫자
			DP[1] = (i / 10) % 10;//10의자리숫자
			DP[2] = i % 10;//1의자리숫자
			if ((DP[0] - DP[1]) == (DP[1] - DP[2]))
			{
				value++;//값 증가 
			}
		}
	}
	return value;
}

int main()
{
	int han;//1000보다 작거나 같은 자연수 N
	//0~99까지는 모두가 한수이다.
	cin >> han;
	cout << method(han);
	return 0;
}
반응형