프로그래머스 연습문제 - 예상 대진표 (level2)

j_wisdom_h·2022년 11월 26일
0

CodingTest

목록 보기
19/58
post-thumbnail

프로그래머스 연습문제 - 예상 대진표

문제설명


제한사항 & 입출력 예


My Solution

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 

이틀연속으로 스스로 문제를 풀지 못해서 오늘은 무조건 풀고야만다는 생각으로 기어코 풀어냈다. 와 이 쾌감.
코드 길이를 보면 한숨이 나오지만 뿌듯하다.


내가 알아낸 규칙은

  1. 대진표를 반을 계속 나눈다.
  2. 같은 방향(오른쪽 or 왼쪽)에 a,b가 있으면 최대횟수(count)에서 -1
  3. a와 b가 반으로 나누었을때 오른쪽에 위치한다면 (a > n and b > n)
    a , b에서 n을 뺀다. 위치를 업데이트 하는 것이다.
  4. 이 과정을 반복하다보면 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

사실 내 풀이는 문제가 원하는 형태의 답은 아니다.
왜냐면 입출력해설을 토대로 작성한 것이 아니라 혼자서 규칙을 찾았기 때문!
이 풀이가 문제가 원하는 정답에 가까울 것 같다.

대진표는 항상 홀,짝이 붙게 되는데 이런 성질을 이용해서
순번를 업데이트해서 두 선수가 만나게 될때(같아질때) 대진횟수를 반환한다.

와 깔끔하다. 이 코드 탐이난다.

profile
뚜잇뚜잇 FE개발자

0개의 댓글