Algorithm/graph

[백준] 알고리즘 2331번 - 반복수열 문제

낭강 2021. 1. 22. 21:36

#include <bits/stdc++.h>
using namespace std;
int check[3000001];
int p;
void dfs(int x) {
    check[x]++;
    if (check[x] == 3) return;
    int sum = 0;
    while (x != 0) {
        sum += pow(x % 10,p);
        x /= 10;
    }
    dfs(sum);
}
int main(){
    int n,ans=0;
    cin >> n >> p;
    dfs(n);
    for (int i = 0; i < 300001;i++) {
        if (check[i] == 1) ans++;
    }
    cout << ans;
}

이 문제는 간단하게 DFS를 이용하여 풀 수 있다.

먼저 최대값을 계산하여 배열 범위정도를 판단할 수 있다.

그런다음 check=1 인 경우는 한번 방문했다는 것을 의미하고

check=2 인 경우는 두번 방문

check=3 인 경우는 하나의 사이클을 이루고 있다는 것을 의미한다.

즉 문제에서 원하는 답은 check=1인 것의 개수를 요구하고 있다.