*반짝이는*이끌림

[C++] 백준 BOJ #1065 한수 본문

Algorithm/Baekjoon Online Judge

[C++] 백준 BOJ #1065 한수

2kkeullim 2020. 4. 15. 13:52

◆ 문제 링크 : https://www.acmicpc.net/problem/1065

 

1065번: 한수

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

www.acmicpc.net

문제

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

 

입력

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

 

출력

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

 

코드

#include <iostream>
using namespace std;

int N, han = 99;
int digit[3];

int main(void) {
	ios_base::sync_with_stdio(false);
	cin.tie(NULL);
	cout.tie(NULL);

	cin >> N;
	if (N <= 99) cout << N << "\n";
	else if (N == 1000) cout << 144 << "\n";
	else {
		for (int i = 100; i <= N; i++) {
			digit[0] = i / 100;			// 100의 자리수
			digit[1] = i / 10 - (digit[0] * 10);	// 10의 자리수
			digit[2] = i % 10;			// 1의 자리수
			if (digit[1] - digit[0] == digit[2] - digit[1]) han++;
		}
		cout << han << "\n";
	}
	return 0;
}

 

해설

- 한수는 주어진 숫자의 연속된 두 개의 수의 차이가 일정한 수입니다. 따라서 한자리 수이거나 두자리 수인 경우 모두 한수이기 때문에, 한자리 수 또는 두자리 수가 입력된 경우 해당 수를 출력하면 됩니다. 또한 문제에서 주어진 N의 범위는 1이상 1000이하이므로, N이 1000인 경우에는 유일하게 네자리 수인 경우입니다. 그래서 따로 case 분류를 해주었습니다.

 

- 그렇다면 신경써야 하는 부분은 N이 세자리 수 입력으로 들어왔을 때입니다. 각 자리의 값들을 digit 배열에 넣어줍니다. (만약 입력을 string(문자열)으로 받을 경우는 이렇게 하지 않아도 됩니다.) 그 후 100의 자리 - 10의 자리의 값과 10의 자리 - 1의 자리의 값들을 비교해 같다면 한수의 값을 하나 증가시킵니다.

 

- 한수의 값을 99로 초기화한 이유는 세 자리 수가 입력으로 들어온 경우 무조건 1~99까지 99개의 수를 한수로 가지고 있기 때문입니다.

 

'Algorithm > Baekjoon Online Judge' 카테고리의 다른 글

[text] 백준 BOJ #11506 占쏙옙  (0) 2020.04.18
[C++] 백준 BOJ #2231 분해합  (0) 2020.04.15
[C++] 백준 BOJ #2309 일곱 난쟁이  (0) 2020.04.15
Comments