Iriton's log

[C++/Baekjoon] 1065번: 한수 본문

Problem Solving/C,C++

[C++/Baekjoon] 1065번: 한수

Iriton 2023. 3. 27. 10:34

문제


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

 

입력


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

 

출력


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

 

풀이


한수의 기준에 따르면, 100 미만의 값들은 모두 한수에 해당된다.

(십의 자리까진 모든 조합을 규칙성으로 볼 수 있기 때문이다.)

문제는 100이 넘어갈 때부터이다.

 

 

한수가 되기 위해서, 백의 자리 수와 십의 자리 수의 차가 십의 자리 수와 일의 자리 수 차와 같아야 한다.

규칙성이 있는지 확인하는 절차이다.

 

그러기 위해선 각 자리의 수를 구해야 한다.

이를 코드로 구현하면 아래와 같다.

for (int i = 100; i <= n; i++) {
			int hun = i / 100; //백의 자리 수
			int ten = (i % 100) / 10; //십의 자리 수
			int one = i % 10; //일의 자리 수

 

위에서 구한 각 자리의 수의 차가 동일하다면, 한수의 카운트를 증가하는 방식으로 진행해야 한다.

(이때 100 이상인 수는 한수 카운트 디폴트값이 99이다.)

 

 

 

즉, 주어진 값이 100 이상인지 미만인지 구분하고

미만이라면 주어진 값 그 자체가 한수의 개수가 되고

이상이라면 각 자리 수의 차를 계산하는 과정이 필요하다.

 

이를 함수로 만들면 아래와 같다.

int check(int n) {
	int cnt = 0;
    
    //100 미만일 시에는 그대로 리턴
	if (n < 100)
		return n;
        
	else {
		cnt = 99;
		
        //각 자리 수의 차를 구하기 위해 각 자리 수의 값을 추출하는 단계
		for (int i = 100; i <= n; i++) {
			int hun = i / 100;
			int ten = (i % 100) / 10;
			int one = i % 10;
			
            //규칙성이 보일 시에 한수 카운트 증가
			if ((hun - ten) == (ten - one))
				cnt++;
		}
	}
	return cnt;
}

 

 

 

main 함수를 추가한 최종 코드


#include <iostream>
using namespace std;

int check(int n) {
	int cnt = 0;
	if (n < 100)
		return n;
	else {
		cnt = 99;

		for (int i = 100; i <= n; i++) {
			int hun = i / 100;
			int ten = (i % 100) / 10;
			int one = i % 10;

			if ((hun - ten) == (ten - one))
				cnt++;
		}
	}
	return cnt;
}

int main() {
	int n;
	cin >> n;
    int result = check(n);
	cout << result << endl;

    return 0;
Comments