1. 문제

1057번: 토너먼트



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