이숭간 공부기록

[프로그래머스] 파이썬 _ 예상 대진표 (토너먼트) 본문

알고리즘/프로그래머스

[프로그래머스] 파이썬 _ 예상 대진표 (토너먼트)

이숭간 2021. 7. 18. 20:49
728x90

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

 

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

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

programmers.co.kr

 

문제유형 : 분할정복?

 

문제풀이

  • 내가 속해있는 팀을 구한다.
  • 걔와 나는 언제 만나는가? --> 서로 같은 팀이 될때 만난다.
  • 두 사람이 같은 팀에 속해질때 까지 팀구하기를 반복한다.

 

정답코드:

def solution(n,a,b):
    answer = 0

    x = min(a,b)
    y = max(a,b)

    while True:
        answer +=1
        x = find_team(x)
        y = find_team(y)
        if x==y:
            return answer

def find_team(n):
    return (n+1)//2

 

 

 

잘못생각한 코드:

코드를 번잡하게 짜지말것, 앞에서 한번하고 그다음부터 while이렇게 하지말고 while로 모든 조건을 검색할수있도록 하자

꼭 마지막에 만나지는것이 아니다!!! 현재 둘이 속해있는팀이 3,4이면 그다음턴에 바로 만나게되므로 이조건은 무한루프를 유발한다...

1,2일때를 체크하는것이아니라그냥 팀이 같아질때까지 쭉 확인하면 되자낭...

def solution(n, a, b):
    answer = 1

    x = min(a, b)
    y = max(a, b)

    x = find_team(x)
    y = find_team(y)

    if x == y:
        return 1

    while True:
        answer += 1
        x = find_team(x)
        y = find_team(y)
        if x == 1 and y == 2:
            break

    return answer + 1


def find_team(n):
    return (n+1)//2