[프로그래머스] 예상 대진표

kiki·2024년 1월 2일
0

프로그래머스

목록 보기
31/78

문제 링크

https://school.programmers.co.kr/learn/courses/30/lessons/12985

문제 설명

토너먼트 경기에서, 게임 참가자 수 N, 참가자 번호 A, 경쟁자 번호 B가 함수 solution의 매개변수로 주어질 때, 처음 라운드에서 A번을 가진 참가자는 경쟁자로 생각하는 B번 참가자와 몇 번째 라운드에서 만나는지 반환하라

1차 시도

def solution(n,a,b):
    a, b = a-1, b-1
    cnt = 0 
    
    while True:
        cnt+=1
        if a//2 == b//2:
            return cnt
        a, b = a//2, b//2

일단 큰 생각은
1. 몫을 사용해야하니 번호를 0부터 시작하도록 각 번호에 -1 해주자.
2. 번호를 2로 나눴을 때 몫이 자신의 다음 번호 (이겼을 때)
3. 두 참가자의 번호를 2로 나눴을 때 몫이 같으면 해당 라운드에 서로 만나 경쟁한다.

이 두 조건을 놓고 봤을 때 결국 a와 b를 2로 나눴을 때 몫이 같다면 해당 라운드에 둘이 만난다는 거고, 아니면 a와 b를 다음 라운드에서 자기 번호로 바꿔주면 되는거.
즉 다음 라운드에서의 번호가 같다는 게 해당 라운드에 둘이 붙어 서로 이길 경우를 가정하는 것임.

뭔가 정리가 되는데 굉장히 복잡한 느낌 !

2차 시도

def solution(n,a,b):
    a, b = a-1, b-1
    cnt = 0 
    
    while a!=b:
        cnt+=1
        a, b = a//2, b//2
    return cnt

위의 코드에서 다음 번호가 같다는 게 해당 라운드에 둘이 붙어 서로 이길 경우 라는 걸 이용해서 while의 조건문을 a와 b의 번호가 같아질 때로 설정하면 코드를 줄일 수 있다.

정리

  • 문제를 잘 읽자. 문제에 문제를 풀기 위해 고려해야하는 부분이 나와있는 경우가 많다. 여기서는 참가자의 다음 라운드에서의 번호였다.

0개의 댓글