본문으로 바로가기

숫자 순환 알고리즘

category 프로그래밍 언어/알고리즘 2019. 1. 4. 18:29

숫자 순환 알고리즘

 

숫자 순환 알고리즘은 주어진 숫자 N 제곱수 P가 주어질 경우

 

각 숫자 N의 자릿수에 P제곱을 하고 더한 값이 각 원소가 됩니다.

 

무슨 말이냐면

 

숫자 57 제곱수 2가 주어지면

 

5^2+7^2=74가 됩니다. 74는 7^2+4^2=65가 됩니다. 이렇게 57, 74, 65, ...원소를 꾸려나갑니다.

 

이런식으로 하다보면 순환이 된다는 것을 발견합니다.

 

이 알고리즘은 비순환 부분의 개수를 찾는 것으로 순환 되는 지점 이전 원소들의 개수를 구하면 됩니다.

 

우선 입력을

<input.txt>

2          (Case Number)

57 2       (N P)

638 2      (N P)

 

이렇게 받는다고 칩시다.

 

입력 형태는

첫 행은 케이스 수

두 행부터 N과 P 입니다.

조건=>  숫자 N 제곱수 P 케이스 수 T

 

 

 

 

입력받은 숫자 값 만큼 곱셈을 반복하여 숫자를 계속 생성해야합니다.

 

그러기 위해서는 우선 제곱수(P) 만큼 for문을 돌려야겠죠?

 

digit은 자릿수로 칩시다. 예를 들어 15라눈 숫자를 10으로 나눈 몫은 십의 자리 수, 나머지는 일의 자리 수 입니다.

 

if(powerNumber>2){

for(i=2; i<=powerNumber; i++)

{

digit *= digit;

}

}

 

즉 digit이 5이고 제곱수 2이면 5를 2번 곱해야하므로 5 *= 5 입니다.

 

여러분들은 배열에서 검사하여 어떤 값과 같으면 끝내는 프로그램들을 많이 짰을 겁니다.

 

예를 들어

for(i=0; i<10; i++)

{

if(A == arry[i])

break;

}

 

이러한 코드는 시간이 굉장히 오래걸리며 최악의 경우 10번까지 검사를 하게되겠죠 ...

 

이를 방지하기 위해 예전에 포스팅 한 계수정렬 기억하실지 모르겠지만 계수정렬에서는 해당 배열의 값을 인덱스로 사용하는

 

원리를 이용했습니다.

 

즉 1부터 10000까지 숫자 중에 해당 숫자가 몇번 카운트 되는지 하기 위해서 counter라는 배열 인덱스에 arry[]배열 값을 넣

 

어서 counter[1]은 1이 나온 횟수로 구했었죠.

 

이 원리가 중요합니다.

 

for(i=0; i<10000; i++){

counter[arry[i]]++;

}

 

이렇게 되면 counter[57]은 57이 몇번 나왔는지 알 수 있겠죠

 

이 코드를 이용해서 배열의 인덱스로 사용하게 되면

 

한번에 검색이 가능합니다.

 

마지막으로 반복되는 숫자가 나타날 때 까지 몇 개의 숫자가 있는지 구해야합니다.

 

즉 연산으로 구한 숫자가 초기 메모장에서 받아온 숫자와 같으면 반복되는 것이므로

 

반복 된다 싶으면 for문을 빠져나오면 됩니다.

 

for(i=0; i<Solution; i++){
    if(initNumber==calculatedNumber[i])

break;

}

 

전체 코드를 봅시다.

 

 

 

'프로그래밍 언어 > 알고리즘' 카테고리의 다른 글

백준 설탕배달  (0) 2019.02.17
백준 보물문제 풀이  (0) 2019.02.17
쉬운 농부 알고리즘  (2) 2018.09.24
동전 옮기기(알고리즘)  (0) 2018.08.24
기약 분수 구하기  (1) 2018.08.23