[백준] 1057 - 토너먼트
1. 문제
2. 개요
A, B를 포함한 N명의 인원이 토너먼트를 진행한다.
각 라운드별로 1번부터 숫자가 배정되고 숫자 순으로 대결이 진행된다.
인원이 홀수인 경우 마지막 번호인 인원은 자동으로 다음 라운드로 진출한다.
A, B는 서로와 만날 때 까지 절대 지지 않는다고 할 때 이 둘이 만나는 라운드를 구하는 문제.
3. 풀이 및 코드
3-1. 풀이
주어진 위치 k에서 이기고 올라가는 경우, 다음 라운드의 번호는 k + 1 // 2 가 된다.
이 둘이 같아진 경우 둘은 시합을 하게 된다는 말이 된다.
두 값이 같아지게 될 때 까지 해당 연산과 라운드를 카운팅하는 반복문을 돌린다.
해당 값이 같아져 반복문에서 탈출했다면 라운드를 출력한다.
3-2. Python
import sys
N, A, B = map(int, sys.stdin.readline().split())
A, B = min(A, B), max(A, B)
cnt = 1
while (A + 1) // 2 != (B + 1) // 2:
A = (A + 1) // 2
B = (B + 1) // 2
cnt += 1
print(cnt)
3-3. C#
namespace boj_1057
{
internal class Program
{
static void Main(string[] args)
{
int[] input = Array.ConvertAll(Console.ReadLine().Split(), int.Parse);
int N = input[0];
int A = (int)MathF.Min(input[1], input[2]);
int B = (int)MathF.Max(input[1], input[2]);
int cnt = 1;
while ((A + 1) / 2 != (B + 1) / 2)
{
A = (A + 1) / 2;
B = (B + 1) / 2;
cnt++;
}
Console.WriteLine(cnt);
}
}
}
Comments