프로그래머_예상 대진표

임정민·2023년 6월 22일
1

알고리즘 문제풀이

목록 보기
66/173
post-thumbnail

프로그래머스 문제입니다.

문제

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

[나의 풀이]

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

    people = []

    for i in range(1,n+1):
        people.append(i)

    cnt = 0

    while True:
        cnt += 1

        if abs(people.index(a)-people.index(b)) == 1:
                if people.index(a) > people.index(b):
                     if people.index(a)%2==1:
                        break
                else:
                     if people.index(b)%2==1:
                        break

        length = len(people)

        for i in range(0,length,2):
            if people[i+1] == a:
                people.append(people[i+1])
                continue
            elif people[i+1] == b:
                people.append(people[i+1])
                continue
            people.append(people[i])

        people = people[length:]

    answer = cnt

    return answer

토너먼트 형식에서 서로를 만나기 전에 항상 이기는 A,B가 몇번째에 만나게 되는지에 대한 문제였습니다. 최초 대회 참가자 리스트(people)를 생성하고 참가자가 A,B는 항상 다음 라운드에 올라가는 방식으로 구현하였습니다. 이때, 맨앞쪽 참가자부터 2명씩 경기하기 때문에 A,B가 2번째,3번째 참가자일 때 한 라운드 더 진행하는 방식으로 조건문을 걸어두었습니다.🙉🙉🙉

[다른 사람의 풀이]

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

    return answer

다른 사람의 아주 간단한 풀이를 볼 수 있었습니다... 😭😭😭
토너먼트 구조이기 때문에 2씩 나누어 갱신하며 A,B(참가자 번호)가 동일할 때의 횟수를 구하는 방식었습니다. 여기서 저의 풀이처럼 A,B가 1차이 나더라도 다음 라운드에서 만나는 경우가 있어 각 +1 한 값에서 몫연산으로 해결한 풀이었습니다. 🐧🐧🐧

반복적으로 2로 나누는 연산이 필요하는 문제에서 항상 +1 하거나 -1 하는 아이디어로 풀리는 경우가 많은 것 같습니다.

감사합니다.

profile
https://github.com/min731

0개의 댓글