개발/algorithm

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

zzi_on2 2022. 4. 11. 21:12

문제 링크

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

 

풀이 

- deque 사용해서 풀이 

큐에 참가자들 삽입 

tmp는 현 라운드에서 붙을 팀의 개수 

num은 다음 라운드임을 체크할 변수 

cnt는 라운드 번호 

 

1. 큐에서 두 참가자 빼기 

- 만약 num이 0 이면 다음라운드라는 뜻이므로 cnt + 1 해주고,  tmp와 num 갱신 

2. 두 참가자가 a와 b이면 cnt 리턴 

3. 두 참가자 중 a가 있으면 a는 항상 이겨야 하므로 큐에 a 삽입 

    두 참가자 중 b가 있으면 b는 항상 이겨야 하므로 큐에 b 삽입 

    두 참가자 모두 a와 b가 아니면 아무나 이겨도 되므로 그냥 작은 값 삽입 

4. 현 라운드에서 붙은 팀의 개수 줄이기 

from collections import deque 

def solution(n,a,b):
	# 남은 참가자 
    q = deque([ i+1 for i in range(n)])
    # 라운드 번호
    cnt = 1
    # 현 라운드에서 붙을 총 팀의 개수 
    tmp = n // 2 
    # 현 라운드에서 남은 붙을 팀의 개수 
    num = tmp
    
    while q :
        # 두 참가자 빼기 
        x = q.popleft()
        y = q.popleft()
        
        # 현 라운드에서 남은 붙을 팀의 개수가 없으면 다음 라운드라는 뜻 
        if num == 0 :
            cnt += 1 
            num = tmp // 2
            tmp = tmp // 2  
            
        # 두 참가자가 a와 b이면 라운드 리턴 
        if x in (a,b) and y in (a,b) :
            return cnt 
        
        # 두 참가자 중 a가 있으면 이긴 사람 a 큐에 삽입 
        if x == a or y == a :
            q.append(a)
        # 두 참가자 중 b가 있으면 이긴 사람 b 큐에 삽입 
        elif x == b or y == b :
            q.append(b)
        # 두 참가자 모두 a와 b가 아니면 아무나 이겨도 상관없으므로 작은 값 삽입 
        else:
            q.append(min(x,y))
            
        # 현 라운드에서 남은 붙을 팀의 개수 줄이기 
        num -= 1