반응형
http://www.jungol.co.kr/bbs/board.php?bo_table=pbank&wr_id=1516&sca=99&sfl=wr_hit&stx=2255
#include <stdio.h>
int N, Nums[20010], Cnt[20010];
int Tmp1[20010], Tmp2[20010];
void memcpy(int* pDst, int* pSrc, int len)
{
for (int i = 0; i < len; i++) pDst[i] = pSrc[i];
}
void memset(int* p, int v, int l)
{
for (int i = 0; i < l; i++) p[i] = v;
}
void Input()
{
scanf("%d", &N);
for (int i = 0; i < N; i++)
{
scanf("%d", Nums + i);
}
}
int gcd(int a, int b)
{
return b ? gcd(b, a % b) : a;
}
int lcm(int a, int b)
{
return a / gcd(a, b) * b;
}
int GetCntOfOrg()
{
//N개 숫자가 각각 원복되는(궤적) 횟수를 구함
memcpy(Tmp1, Nums, N);
int* pDst, *pSrc, LCM = 1;
for (int mixcnt = 1, cardcnt = 0; cardcnt != N; mixcnt++)
{//카드 전부 다 찾으면 탈출
//한 번 섞는다.
if (mixcnt % 2) //홀수인 경우, Tmp1에서 Tmp2 복사
{
pDst = Tmp2; pSrc = Tmp1;
}
else //짝수인 경우(처음포함) -> Tmp3에서 Tmp1 복사
{
pDst = Tmp1; pSrc = Tmp2;
}
for (int j = 0; j < N; j++) //한바퀴 섞음
{
pDst[j] = pSrc[Nums[j] - 1];
//비교해서 원복횟수 찾은 곳은 업데이트 하고, 몇 개 찾았는지도 카운트 한다.
if (Cnt[j] == 0)
{
if (Nums[j] == pDst[j])
{
Cnt[j] = mixcnt;
LCM = lcm(LCM, mixcnt);
cardcnt++;
}
}
}
}
return LCM;
}
int main(void)
{
Input();
printf("%d\n", GetCntOfOrg());
return 0;
}
반응형
'프로그래밍 알고리즘' 카테고리의 다른 글
[정올 2300] 용액 (0) | 2023.01.07 |
---|---|
[정올 2261] 경로 찾기 (0) | 2023.01.07 |
[정올 2247] 도서관 (0) | 2023.01.07 |
[정올 2194] 요플레공장 (1) | 2023.01.07 |
[정올 2082] 힙정렬2 (Heap_Sort) (0) | 2023.01.07 |