https://school.programmers.co.kr/learn/courses/30/lessons/12985
def solution(n, A, B):
cnt = 0
my_list = [i for i in range(1, n + 1)]
while True:
tornament = []
for i in range(0, len(my_list), 2):
if [min(A, B), max(A, B)] == [min(my_list[i], my_list[i + 1]), max(my_list[i], my_list[i + 1])]:
return cnt + 1
elif my_list[i] == A or my_list[i] == B:
tornament.append(my_list[i])
elif my_list[i + 1] == A or my_list[i + 1] == B:
tornament.append(my_list[i + 1])
else:
tornament.append(my_list[i])
cnt += 1
my_list = tornament
return cnt
풀이 1은 매 라운드마다 리스트(tornament)를 새로 만들고 갱신해야 한다. 이것은 불편한 메모리 사용이 있을 수 있고, N이 클수록 효율성이 떨어지게 된다.
따라서 리스트를 새로 만들지 않고 수정하는 방식으로 문제를 해결하는 것이 좋다. 주어진 A,B의 현재 라운드에서 번호를 계산하고 다음 라운드로 넘어가면서 번호르르 업데이트하는 방식을 사용하면 된다.
def solution(n,a,b):
counts =0
while a!=b:
a,b= (a//2)+(a%2), (b//2)+(b%2)
counts +=1
return counts