알고리즘

[백준/구현/C++] 2331번 반복수열

데메즈 2022. 12. 29. 16:57
728x90
반응형

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

2331번: 반복수열

첫째 줄에 반복되는 부분을 제외했을 때, 수열에 남게 되는 수들의 개수를 출력한다.

www.acmicpc.net

1. 우선 수를 한자리씩 분리한다
참고 : https://develop-me-z.tistory.com/103

[C++] 숫자 한자리씩 분리하기

숫자 쪼개기 10으로 나누면서 10으로 나눈 나머지를 분리해주면 된다 while(a!=0){ int rest = a%10; a /= 10; }

develop-me-z.tistory.com

2. 각 자리를 거듭제곱하면서 더해준다
참고 : https://develop-me-z.tistory.com/104

[C++] 수 거듭 제곱하기 (POW 함수)

헤더파일 사용방법 pow (double base, double n) : base 의 n제곱을 구한다 pow (float base, float n) pow (long double base, long double n) 예시 pow(10, 2) = 100 pow(10, 3) = 1000

develop-me-z.tistory.com

3. 벡터에 구한 수가 들어있는지 확인하고 없으면 벡터에 넣고 있으면 인덱스를 반환한다
참고 : https://develop-me-z.tistory.com/105

[C++] vector - find 함수 (값의 존재 유무 확인 & 위치 구하기)

헤더파일 #include 사용방법 vector v; int num; // 찾을 수 if(find(v.begin(), v.end(), num) == v.end()){ // 벡터 안에 없는 경우 } else { // 벡터안에 값이 있는 경우 cout

develop-me-z.tistory.com

#include <bits/stdc++.h>

using namespace std;

int a, p;
vector<int> v;
bool tmp;

int main(void) {
    cin >> a >> p;

    v.push_back(a);

    int sum;
    int result = 0;
    while(tmp != true){
        sum = 0;
        while(a!=0){
            int rest = a%10;
            sum += pow(rest, p);
            a /= 10;
        }
        if(find(v.begin(), v.end(), sum)==v.end()){ // v에 없으면
            v.push_back(sum);
        }else{
            tmp = true;
            result = find(v.begin(), v.end(), sum) - v.begin(); // 인덱스 출력
        }
        a = sum;
    }
    cout << result << endl;

    return 0;
}

728x90
반응형