본문 바로가기

알고리즘/SWEA

8673

static int K;
static int tables[2][100000];
static int cnt[] = { 1, 2, 4, 8, 16, 32, 64, 128, 256, 512, 1024 };

static int solution(void)
{
	int n, loop, turn = 0, tot = 0;

	scanf("%d", &K);
	for (int i = 0; i < cnt[K]; i++)
		scanf("%d", &tables[0][i]);

	n = cnt[K];
	loop = cnt[K] / 2;
	while (loop > 0)
	{
		for (int i = 0, j = 0; i < n; i += 2)
		{
			if (tables[turn][i] > tables[turn][i + 1])
			{
				tables[1 - turn][j++] = tables[turn][i];
				tot += (tables[turn][i] - tables[turn][i + 1]);
			}
			else
			{
				tables[1 - turn][j++] = tables[turn][i + 1];
				tot += (tables[turn][i + 1] - tables[turn][i]);
			}
		}
		loop /= 2;
		n /= 2;
		turn = 1 - turn;
	}

	return tot;
}

 

매 토너먼트 시 참가자의 수는 해당 회차전에서 둘 중 하나만 다음라운드로 진출하기 때문에 절반씩 줄어드는 것은 당연한다.

 

남은 건 최대 몇 라운드 까지 토너먼트가 진행 되는 지 이다.

참가자 수가 2^K 명 일 때, K라운드 까지만 하면 된다.

 

코드 나누기 2로 해서 2의 지수 승을 낮추는 것 처럼 되어 있는데, loop = K - 1; 로 하고, loop -= 1;  그 카운트를 낮추는 것이 더 효율적이다. 이 부분은 처음 코딩 할 때 중간에 착각했던 것 같다. 

'알고리즘 > SWEA' 카테고리의 다른 글

5644. 무선 충전  (0) 2021.11.09
5650. 핀볼게임  (0) 2021.11.08
2112  (0) 2021.11.08
8659  (0) 2021.11.08
8658  (0) 2021.11.08