토너먼트 게임에서 A번 참가자와 B번 참가자가 서로 붙게 되기 전까지 항상 이긴다고 가정할 때, 몇 번째 라운드에서 만나는 지를 반환하는 함수 작성
def solution(n,a,b):
# 발생할 수 있는 최대 라운드 수 계산
max_round = 0
while 2 ** max_round < n:
max_round += 1
# 이진 탐색 적용
a, b = min(a, b), max(a, b) # 큰 수, 작은 수 구분
mid = n // 2 # 최초 중간값
lower = 0 # 최초 최소값
upper = n # 최초 최대값
while True:
# 탈출 조건 // 두 수가 포함된 라운드가 서로 다를 경우
if a <= mid and b > mid:
break
# 작은 수가 중간값보다 클 경우(라운드에서 두 수가 같은 그룹에 있을 경우)
elif a >= mid:
lower = mid
mid = (mid + upper) // 2
max_round -= 1 # 라운드값 -1
# 큰 수가 중간값보다 작거나 같을 경우(라운드에서 두 수가 같은 그룹에 있을 경우)
elif b <= mid:
upper = mid
mid = (mid + lower) // 2
max_round -= 1 # 라운드값 -1
return max_round
while
Loop을 활용, 2의 x제곱이 n과 같아지는 시점까지 max_round
변수를 1씩 증가시킴.a
와 b
의 대소를 비교하여 작은 수를 a
에, 큰 수를 b
에 재할당하고, 최초 중간값/최소값/최대값을 설정while
Loop을 무한 반복하되, 탈출조건으로 두 수가 서로 다른 라운드에 포함되어있을 경우를 설정mid
보다 클 경우, 또는 큰 수가 mid
보다 작을 경우)하여 해당 경우에는 max_round
를 1씩 뺌def solution(n,a,b):
round = 0
while a != b:
round += 1
a = (a+1) // 2
b = (b+1) // 2
return round
round
에 초기값 0을 부여a
와 b
가 서로 다를 경우를 반복하는 while
Loop 내에서 시작과 동시에 round
를 1 증가시킴0 1 1 2 2 3 3 4
이지만 1을 더했을 경우 1 1 2 2 3 3 4 4
가 되므로 원하고자 하는 결과값을 얻을 수 있음