공부하고 기록하는, 경제학과 출신 개발자의 노트

프로그래밍/코딩테스트 문제풀이

[Python] 프로그래머스. 예상 대진표 (Level 2)

inspirit941 2020. 10. 29. 18:30
반응형

programmers.co.kr/learn/courses/30/lessons/12985#

 

코딩테스트 연습 - 예상 대진표

△△ 게임대회가 개최되었습니다. 이 대회는 N명이 참가하고, 토너먼트 형식으로 진행됩니다. N명의 참가자는 각각 1부터 N번을 차례대로 배정받습니다. 그리고, 1번↔2번, 3번↔4번, ... , N-1번↔N

programmers.co.kr

A < B인 A, B를 전제하면, 문제 조건에서 A와 B는 서로 만나기 전까지 반드시 승리하므로

A와 B는 대전을 거쳐갈 때마다 (자신의 위치 // 2 + 자신의 위치 % 1) 이 된다.

 

ex) A. B = 4, 7인 경우
1회 대전 후 A와 B의 위치는

A는 3과 대전해 승리하므로 (4 // 2 + 4 % 2) = 2번째.

B는 8과 대전해 승리하므로 (7 // 2 + 7 % 2) = 4번째.

 

 

def solution(n,a,b):
# a < b 이도록 변환.
a, b = min(a,b), max(a,b)
count = 1
# b-a == 1 이면 a와 b가 만나는 시점.
# 더 큰 값인 b가 홀수면, b는 a가 아니라 b 오른쪽 사람과 겨뤄야 한다.
# ex) a, b = 2, 3일 경우
# 1-2, 3-4 형태로 먼저 대전한 다음에야 만날 수 있음.
while b - a != 1 or b % 2 != 0:
o_a, r_a = divmod(a, 2)
# a가 이겼을 경우 다음 라운드에서 본인의 번호
a = o_a + r_a
# b가 이겼을 경우 다음 라운드에서 본인의 번호
o_b, r_b = divmod(b, 2)
b = o_b + r_b
count += 1
return count
반응형