[ 백준 1065번 ] 한수

2021. 12. 2. 12:56백준/단계별 문제

백준 1065번 / 6단계 / 한수

 

백준 1065번 - 한수

 

채점 결과는 다음과 같다

  메모리 시간
1번째 방법    

 

문제 풀이
이 문제는 일단 한수의 조건인 등차수열에 대해 알아야 한다
문제를 풀기 전에 먼저 예외 케이스부터 찾아봤다
일단 두 자릿수의 수일 경우 각 자릿수의 수열 관계가 1개밖에 없기 때문에
100 미만의 수들은 다 한수 처리를 해주면 된다
예를 들어 42라는 숫자가 있으면 4 -> 2는 -2이고 다음 2라는 숫자 뒤에 수가 없기 때문에 한수가 되는 것이다
이 정보를 토대로 100미만의 숫자는 그 숫자가 다 한수 개수이므로 42라는 숫자를 입력받으면
한수의 개수는 42개인 것이다.
두 번째로 1보다 크고 1000 이하의 숫자를 입력받는 것인데 1000이면 한수 개수는 144개 고정이다.

1. 우선 1부터 정수 n까지의 한수 개수를 알기 위해 정수 n을 입력받고 if 문을 써서 100 이상의 수가 들어오면 반복문을 100부터 n까지 실행시킨다 각 자릿수를 한 배열에 한자리씩 분리해서 저장한다

100
1 / 0 / 0

123
1 / 2 / 3

2. 분리해서 저장한 백의 자릿수와 십의 자릿수를 비교해서 차이 값을 value_1에 저장을 하고
십의 자릿수와 일의 자릿수를 비교해서 차이 값을 value_2에 저장을 한다

100
1 - 0 = value_1 (1)
0 - 0 = value_2 (0)

123
1 - 2 = value_1 (-1)
2 - 3 = value_2 (-1)

3. if 문을 써서 저장한 value_1 값과 value_2 값이 동일하면 각 자릿수가 등차수열을 이루므로 그 수는 한수이므로 카운팅 변수인 cnt를 플러스해 준다

100
value_1 (1) == value_2 (0) // false
123
value_1 (-1) == value_2 (-1) // true, cnt++

4. 100 미만의 수를 입력받으면 그 수가 한수의 개수이다.
5. 1000이라는 수를 입력받으면 한수의 개수는 144개이다.

 

코드
#include <iostream>
#include <algorithm>
#include <math.h>

using namespace std;

int main() {
	int num[3];
	int n, i, value_1, value_2;
	int cnt = 99, cycle = 0;
	
	cin >> n;
	cycle = n;

	if ( n >= 100 ) {
		for ( i = 100; i <= cycle; i++ ) {
			num[0] = ( i / 100 ) % 10;
			num[1] = ( i / 10 ) % 10;
			num[2] = i % 10;

			value_1 = num[0] - num[1];
			value_2 = num[1] - num[2];

			if ( value_1 == value_2 ) cnt++;
		}
	}
	
	if ( n < 100 ) cnt = n;
	if ( n == 1000 ) cnt = 144;

	cout << cnt;
}