알고리즘/백준

백준 1065 한수 c++ [컴공과고씨]

시간빌게이츠 2022. 3. 29. 18:41
반응형

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

 

1065번: 한수

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

www.acmicpc.net

n이 100보다 작으면 모두 등차수열인 수 인것을 인지.

숫자마다 각 자리수를 빼서 비교하여 등차 수열인지 아닌지 판별해주면됨.

 

문제풀이

1. 자리수 배열, 자리수 차이 배열 선언

2. 100보다 작은 경우 입력값 N을 출력

3. 100보다 클 경우 각 자리수를 배열에 저장

4. 각 자리수 배열에서 그 다음 인덱스 값을 빼서 자리수 차이 배열에 저장

5. 자리수 차이 배열의 값을 비교하여 한개라도 다르면 false 반환

6. true일 경우 카운트 +1을 해줌

7. 위 방법은 100부터 센것이기 때문에 최종 카운트에 99를 더해주면 답이됨.

 

전체코드

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
38
39
#include <iostream>
#include <cstring>
using namespace std;
int main(){
    int n;
    int num[5], sub[4]; // 자리수 배열, 자리수 차이 배열
    int a, ans, indx;
    ans = 0;
    cin >> n;
    if(n < 100){
        cout << n; // 100이하일 경우 모든 수가 등차수열
        return 0;
    }
    for (int i = 100; i <= n; i++){
        a = i;
        indx = 0;
        while(a!=0){
            num[indx] = a % 10// 각 자리수를 저장
            a /= 10;
            indx++;
        } 
        for (int j = 0; j < indx - 1; j++){
            sub[j] = num[j] - num[j + 1]; // 자리수 차를 저장
        }
        bool isit = true;
        for (int j = 0; j < indx - 2;j++){
            if(sub[j] != sub[j+1]){
                isit = false// 자리수의 차를 비교하며 다르면 false
                break;
            }
        }
        if(isit){ // 자리수의 차가 모두 같은 경우 카운트
            ans++;
        }
    }
    cout << ans + 99
    //100보다 큰 경우 카운트를 했으므로 100보다 작은 한수도 더해줌
    return 0;
// 16 min
cs

 

체감 난이도 걸린 시간 참고 사용 알고리즘
중하 16min x 브루트 포스
(brute force)
반응형