정수론(Number theory)

백준 1065번: 한수

cepiloth 2018. 7. 3. 09:57
반응형

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


1. 문제

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


2. 알고리즘

키워드 - 수학, 구현


문제를 접근 하기 위해서는 먼저 등차 수열이 무엇인지를 이해 해야 한다.


수학에서, 등차수열(等差數列, 문화어: 같은차수렬, 영어: arithmetic sequence)은 연속하는 두 항의 차이가 모두 일정한 수열을 뜻한다. 예를 들어 1, 3, 5, 7, 9, ...은 등차수열이다. 이때 두 항의 차이는 이 수열의 모든 연속하는 두 항들에 대해서 공통적으로 나타나는 차이므로, 공차(common difference)라고 한다. 예를 들어, 앞의 수열의 공차는 2이다.



문제에서 정의 된 예를 보면 321 의 각각의 숫자의 공차는 -1 이다.

135 의 숫자의 공차는 2 이다.


문제의 조건을 나누어 보자


- 1의 자리숫자 -> 모두 한수

- 10의 자리 숫자 -> 모두 한수

결국 1 부터 100 사이의 수는 100 을 제외한 99 가 한수이다.


3. 코드


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
33
34
35
36
37
#include <iostream>
#include <algorithm> // min
#include <math.h>
#include <string>
#include <vector>
 
using namespace std;
 
int main() {
    ios::sync_with_stdio(false); cin.tie(0);  // scanf 안쓸 경우 쓰세요. Cin 사용시
    int n; cin >> n;
 
    int count = 0;
    int cand[3= { 0, };
 
    for (int i = 1; i <= n; i++) {
        if (i > && i < 100) {
            count++;
        }
        else if(i == 1000){
            break;
        }
        else {
            int cand2 = i;
            for (int j = 0; j < 3; j++) {
                cand[j] = cand2 % 10;
                cand2 = cand2 / 10;
            }
 
            if (cand[0- cand[1== cand[1- cand[2])
                count++;
        }
    }
    cout << count << "\n";
 
    return 0;
}
cs

반응형