프로그래머스 연습문제 - 예상 대진표
def solution(n,a,b):
count = 0
# a는 b보다 작다 (뒤의 반복문을 하기 위해 정렬을 한 것)
if a > b:
a, b = b, a
# 최대 대진횟수
p = n
while p != 1:
p = p //2
count += 1
# 계속 반으로 나누었을때
# 같은 방향에 존재하는 경우 -1
# 다른 방향에 존재하는 경우 리턴
while n >= 1:
n = n // 2
if a > n and b > n:
count -= 1
# n이 n/2이 되었으므로 a,b는 항상 n보다 커지므로
# a,b를 업데이트 반으로 나누었을때의 위치에 맞게 업데이트
a -= n
b -= n
elif a <= n and b<= n:
count -= 1
elif b > n and a <= n :
return count
이틀연속으로 스스로 문제를 풀지 못해서 오늘은 무조건 풀고야만다는 생각으로 기어코 풀어냈다. 와 이 쾌감.
코드 길이를 보면 한숨이 나오지만 뿌듯하다.
내가 알아낸 규칙은
- 대진표를 반을 계속 나눈다.
- 같은 방향(오른쪽 or 왼쪽)에 a,b가 있으면 최대횟수(count)에서 -1
- a와 b가 반으로 나누었을때 오른쪽에 위치한다면 (a > n and b > n)
a , b에서 n을 뺀다. 위치를 업데이트 하는 것이다.- 이 과정을 반복하다보면 a,b가 있는 방향이 달라진다. 이때 count를 리턴한다.
def solution(n,a,b):
answer = 0
while a != b:
answer += 1
a, b = (a+1)//2, (b+1)//2
return answer
사실 내 풀이는 문제가 원하는 형태의 답은 아니다.
왜냐면 입출력해설을 토대로 작성한 것이 아니라 혼자서 규칙을 찾았기 때문!
이 풀이가 문제가 원하는 정답에 가까울 것 같다.
대진표는 항상 홀,짝이 붙게 되는데 이런 성질을 이용해서
순번를 업데이트해서 두 선수가 만나게 될때(같아질때) 대진횟수를 반환한다.
와 깔끔하다. 이 코드 탐이난다.