honey_pot

[python] 예상 대진표 본문

문제 풀이

[python] 예상 대진표

_tera_ 2022. 8. 6. 16:44

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


for문으로 i, i+1 쌍으로 값을 비교하고 step=2 로 증가할까 생각했다가 left, right로 인덱싱을 생각하는게 더 직관적일 것 같아서 변경 

어차피 같은 아이디어이니까 for문으로 해도 상관은 없다

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
import math
 
 
def solution(n, a, b):
    answer = 0
    players = [i for i in range(1, n + 1)] # 1부터 n까지 선수 등록
    rounds = int(math.log2(n)) # 총 라운드 수 n = 2^m 에서 m
    for rnd in range(1,rounds+1):
        left, right = 01
        next_players = []
        while left < right and right < len(players):
            if (players[left], players[right]) == (a,b) or (players[left], players[right]) == (b,a): # a,b가 한 쌍이 되었을 때
                answer = rnd 
                break
            elif players[left] in [a,b]: # a 혹은 b인 경우 무조건 승리
                next_players.append(players[left])
            elif players[right] in [a,b]:
                next_players.append(players[right])
            else# 그 외의 경우
                next_players.append(players[left]) # 임의로 짝수 인덱스 선수들이 이겼다고 침
            left += 2
            right += 2
        players = next_players # 다음 라운드로 진출한 선수들을 다음 라운드에서 players로 
    return answer
cs

 

총 라운드 수는 주어진 n이 2의 몇 제곱인지에 따라 제곱수이고

진행되는 대결 횟수는 n-1 회, 다음 라운드로 진출할 때의 순서 인덱스 값이 대결을 했던 선수들 중 짝수의 값, 즉 둘 중 더 큰 값의 인덱스의 1/2이라는 걸 이용해서 코드를 더 줄일 수도 있다. 선수가 1부터 1 차이로 순서대로 정렬되어 있는 상태이기 때문에 그냥 값으로 계산해도 된다

1
2
3
4
5
6
7
8
9
10
11
import math
def solution(n,a,b):
    answer = 0
    while True:
        answer +=1
        a = math.ceil(a/2)
        b = math.ceil(b/2)
        if a == b or a == 0 or b == 0:
            break
 
    return answer
cs

a,b는 누굴 만나든 다 이기는 조건이 있기 때문에 중간에서 만나는 경우(a==b) 마지막 라운드에서 만나는 경우(a==0 or b==0)가 존재한다. a,b를 계속 2로 나누다가 두 값이 일치하거나 한 값이 0이 되는 경우가 답이 된다.

 

'문제 풀이' 카테고리의 다른 글

[python] 전력망을 둘로 나누기  (0) 2022.08.11
[python] n^2 배열 자르기  (0) 2022.08.08
[python] 방금 그곡  (0) 2022.08.05
[Python] [3차] 파일명 정렬  (0) 2022.08.03
[python] 주차 요금 계산  (0) 2022.07.31
Comments