프로그래밍/백준 알고리즘

백준 알고리즘 2331번 - 반복수열

good programmer 2019. 5. 27. 15:48

dfs를 사용해서 사이클을 찾는 문제.

계속 답을 넣어도 예제는 맞는데 답은 틀리게 나오고 반례도 도저히 못 찾겠어서 다른 블로그 보고 푼 문제.

다 맞게 풀고 MAX의 크기를 너무 크게 잡아서 에러가 뜬 것 같다(..) 로직 자체는 동일하니.. 왜 런타임 에러로 안 뜨고 그냥 "틀렸습니다"가 뜨는지...

 

처음 입력 받은 수를 A라고 하자.

규칙에 따른 수를 생성해 나가면서, 그 수를 인덱스로 가지는 배열의 값을 방문 할 때마다 1씩 늘인다.

사이클이 있다면 그 사이클을 돌텐데, 그럼 그 사이클에 해당하는 배열 값들이 늘어날 것이다.

사이클을 2번 돌리면? 사이클에 있는 수들이 전부 다 2가 되겠지. 그리고 또 사이클에 들어가면 사이클에 있는 첫 번째 값이 3이 되면서 함수를 종료시킨다. 

 

 

소스 코드

#include <iostream>
#include <cmath>
#include <cstring>

#define MAX 300001

using namespace std;

int p;
int visited[MAX]={0,};

void dfs(int num)
{
	//그 수를 인덱스로 가지는 배열의 값을 방문 할 때마다 1씩 늘린다.
	visited[num]++;
	if(visited[num]==3){
		return ;
	}
	int sum=0;
	while (num){
        //수 생성
        sum += pow((num % 10), p);
        num /= 10;
    }
	//dfs 돌리면서 계속 다음 수를 찾아나간다.	
	dfs(sum);
}

int main() 
{
	int a;
	scanf("%d%d",&a,&p);
	dfs(a);
	
	int noCycle=0;
	for(int i=0;i<MAX;i++){
//1번 돌았다면 사이클이 아니다
		if(visited[i]==1) noCycle++;
	}
	cout<<noCycle<<endl;
}

소스코드