본문 바로가기

Algorithm/Brute-force

[C++] 백준 1065번 : 한수 (S4)

#문제

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

 

1065번: 한수

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

www.acmicpc.net

#풀이

문제에서 N이 1000 이하의  자연수라고 하였으므로 경우를 그냥 나누어 문제를 풀 수 있다. 우선 1부터 99까지는 모두 한수이고, 1000은 한수가 아니다. 따라서 우리는 세 자릿수가 한수인지 판단하기만 하면 문제가 해결된다. 이는 각 자릿수를 살펴보는 법을 이용하면 된다.(10으로 나눈 나머지를 구하고 10으로 나눈다)

만약 N이 매우 큰 수로 주어진다면 이러한 방법을 이용할 수 없을 것이다. 그때는 while문을 이용하여 등차가 같은지 계속해서 확인하고 등차가 달라졌다면 break 하는 방법을 시도할 수 있겠다.

#소스코드

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
#include<iostream>
using namespace std;
 
int main(void)
{
    int N;
    cin >> N;
    if (N == 1000) N = 999;//1000은 어차피 한수가 아니므로
    int cnt = 0;//한수의 개수를 count할 변수
 
    for (int i = 1; i <= N; i++) {
        if (i <= 99) {
            cnt++;
        }
        else{
            //i는 100부터 999까지
            int temp = i;
            int n1 = temp % 10;
            temp /= 10;
            int n2 = temp % 10;
            temp /= 10;
            int n3 = temp;
            if ((n2 - n1) == (n3 - n2))
                cnt++;
        }
 
    }
 
    cout << cnt;
 
    return 0;
}
cs