프로그래밍 알고리즘

[정올 2255] 섞기 수열

꾸준한사람 2023. 1. 7. 18:45
반응형

http://www.jungol.co.kr/bbs/board.php?bo_table=pbank&wr_id=1516&sca=99&sfl=wr_hit&stx=2255 

 

JUNGOL

 

www.jungol.co.kr

#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