https://www.acmicpc.net/problem/1057
1057번: 토너먼트
김지민은 N명이 참가하는 스타 토너먼트에 진출했다. 토너먼트는 다음과 같이 진행된다. 일단 N명의 참가자는 번호가 1번부터 N번까지 배정받는다. 그러고 난 후에 서로 인접한 번호끼리 스타를
www.acmicpc.net
문제
김지민은 N명이 참가하는 스타 토너먼트에 진출했다. 토너먼트는 다음과 같이 진행된다. 일단 N명의 참가자는 번호가 1번부터 N번까지 배정받는다. 그러고 난 후에 서로 인접한 번호끼리 스타를 한다. 이긴 사람은 다음 라운드에 진출하고, 진 사람은 그 라운드에서 떨어진다. 만약 그 라운드의 참가자가 홀수명이라면, 마지막 번호를 가진 참가자는 다음 라운드로 자동 진출한다. 다음 라운드에선 다시 참가자의 번호를 1번부터 매긴다. 이때, 번호를 매기는 순서는 처음 번호의 순서를 유지하면서 1번부터 매긴다. 이 말은 1번과 2번이 스타를 해서 1번이 진출하고, 3번과 4번이 스타를 해서 4번이 진출했다면, 4번은 다음 라운드에서 번호 2번을 배정받는다. 번호를 다시 배정받은 후에 한 명만 남을 때까지 라운드를 계속 한다.
마침 이 스타 대회에 임한수도 참가했다. 김지민은 갑자기 스타 대회에서 우승하는 욕심은 없어지고, 몇 라운드에서 임한수와 대결하는지 궁금해졌다. 일단 김지민과 임한수는 서로 대결하기 전까지 항상 이긴다고 가정한다. 1 라운드에서 김지민의 번호와 임한수의 번호가 주어질 때, 과연 김지민과 임한수가 몇 라운드에서 대결하는지 출력하는 프로그램을 작성하시오.
풀이
스타 토너먼트의 총 라운드 수는 log(총 참가자 수)다.
라운드마다 승리하면 바뀌는 지민이와 한수의 번호를 가지고 비교해 만나는 라운드를 구하면 쉽게 풀 수 있다.
소스코드
n, jimin, hansoo= map(int, input().split())
rounds = ceil(log2(n))
if jimin > hansoo:
mx = jimin
mn = hansoo
else:
mx = hansoo
mn = jimin
result = 0
for i in range(rounds):
if (mx-mn) == 1 and (mn%2) == 1:
result = i+1
break
else:
if mx%2 == 1: mx = (mx//2)+1
else: mx = mx/2
if mn%2 == 1: mn = (mn//2)+1
else: mn = mn/2
print(result)
'Algorithm > BaekJoon' 카테고리의 다른 글
[백준] C# 알고리즘 풀이 1027번 - 고층 건물 (0) | 2023.03.08 |
---|