백준 1057번: 토너먼트 (C++)

2023. 1. 17. 21:18알고리즘/브루트포스

https://www.acmicpc.net/problem/1057

 

1057번: 토너먼트

김지민은 N명이 참가하는 스타 토너먼트에 진출했다. 토너먼트는 다음과 같이 진행된다. 일단 N명의 참가자는 번호가 1번부터 N번까지 배정받는다. 그러고 난 후에 서로 인접한 번호끼리 스타를

www.acmicpc.net

 

풀이

kim과 im의 번호를 뺏을 때 1이고 그 중 큰 번호가 짝수일 때 둘이 만나는 라운드다.

이 법칙에 따라 while문의 내용을 넣어주었고 kim과 im을 계속 2로 나누어서 진행시켰다.

while문을 탈출하면 둘이 만나는 라운드기 때문에 round를 출력시켰다.

 

간단하게 구성한 줄 알았는데 문제를 풀고 다른 블로그를 찾아보니

조금 더 간단하게 구성한 while문이 있었다. 

 

 

kim을 2로 나눌때 3 / 2 = 1이고 4 / 2 = 2라서

홀수일 때와 짝수일 때를 구분해서 진행시켜주었는데

		if (kim % 2) kim = kim / 2 + 1;
		else kim /= 2;

 

이렇게 한 줄로 간단하게 구성할 수 있었다.

kim = (kim + 1) / 2;

 

전체 코드

#include <iostream>
#include <cmath>

using namespace std;

int main() {
	ios_base::sync_with_stdio(false);
	cin.tie(NULL);

	int N, kim, im;
	int round = 1;

	cin >> N >> kim >> im;

	while (max(kim, im) % 2 || abs(kim - im) > 1) {
		if (kim % 2) kim = kim / 2 + 1;
		else kim /= 2;

		if (im % 2) im = im / 2 + 1;
		else im /= 2;

		round++;
	}
	cout << round;
}