[C++] 백준 1065 한수
2022. 5. 6.
반응형

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

 

1065번: 한수

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

www.acmicpc.net

 

1. 서론

 

백준에서 풀려고 했지만 실패한 문제에서 발견한 문제! 4년 전에... 그러니까 3학년? 일 때인가? 여하튼 그때 뭔 문제도 제대로 이해하지 못한 듯한 기상천외한 방법으로 트라이한 흔적이 있어서 뭔데 못 풀었지? 하고 푼 문제 브루트 포스고 진짜 쉬움;

 

2. 문제 풀이

 

어떤 수 N이 주어진다. 그 수를 1~N까지 보면서 각자리가 등차수열인 수는 몇 개인지를 구하는 문제이다.

 

예를 들어 123이라는 숫자가 있으면 1 2 3 각각 1씩 차이가 나는 등차수열이므로 이 문제에서 말하는 '한수'인 것이다.

 

이 문제의 포인트는 입력받은 숫자를 자릿수 별로 비교하는 것이다. 나는 정수를 문자열로 바꿔서 각각 배열에 자릿수 별로 넣어준 뒤 숫자로 변환해 등차수열인지 아닌지를 구해줬다. 등차수열인지 아닌지는 두 번째 자릿수와 첫 번째 자릿수를 빼서 저장해놓고 그 뒤로도 배열이 끝날 때까지 두 숫자를 빼고 비교하면서 이 값과 같은지 아닌지를 판별하게 했다. 그래서 등차수열이면 cnt 하도록 했다.

 

3. 코드 설명

 

#include <vector>
#include <string>
#include <iostream>

using namespace std;

int main()
{
    int i, j, n, cnt = 0, t, f;
    string s;

    cin >> n;

    for (i = 1; i <= n; i++)
    {
        vector<int> v;
        s = to_string(i);

        for (j = 0; j < s.size(); j++)
            v.push_back(s[j] - '0');

        t = v[1] - v[0], f = 0;
        for (j = 2; j < v.size(); j++)
            if (v[j] - v[j - 1] != t)
                f = 1;

        if (f == 0) cnt++;
    }

    cout << cnt << endl;
}

 

처음에는 f를 써서 등차수열인지 판별하는 부분을 bool형식 함수로 따로 빼서 해줬었는데 그냥 그렇게 복잡한 로직도 아니고 다시 메인 함수에 넣어줬다 ㅎㅎ

 

 

 

반응형
myoskin