Algorithm/SW Expert Academy

[Python] 4880. 토너먼트 카드 게임

느낌표 공장장 2021. 9. 21. 23:57

asdf

# 가위바위보 (1: 가위, 2: 바위, 3: 보)
def game(c1, c2):

    # 가위바위보 버전 1
    # c1이 이겼을 경우 혹은 비겼을 경우(c1이 인덱스가 작으므로 c1 반환)
    if cards[c1] == cards[c2] or cards[c1] % 3 == (cards[c2] + 1) % 3:
        return c1

    # c2가 이겼을 경우
    return c2

    # 가위바위보 버전 2
    # if (cards[c1] - cards[c2]) % 3 == 2:
    #     return c2
    # return c1

    # 가위바위보 버전 3
    # if cards[c1] == 1:
    #     return c2 if cards[c2] == 2 else c1
    # elif cards[c1] == 2:
    #     return c2 if cards[c2] == 3 else c1
    # else:
    #     return c2 if cards[c2] == 1 else c1


# 토너먼트(시작 지점, 끝 지점)
# (자기 자신 밖에 없어서) 대결할 사람이 없을 때까지 토너먼트한다.
def tournament(s, e):
    # 대결할 사람 없으면(한 명일 때) 현재 인덱스(s) 반환
    if s == e:
        return s

    m = (s + e) // 2            # 중간 지점 구하기 예) [1, 2, 3] s = 0 e = 2
    g1 = tournament(s, m)       # 중간기준 앞 그룹 토너먼트 하기 [1, 2] s = 0, e = 1 -> [1] s = 0, e = 0 -> 0 / [2] s = 1, e = 1 -> 1
    g2 = tournament(m+1, e)     # 중간기준 뒤 그룹 토너먼트 하기 [3] -> s = e = 2 -> 2 (cards[2] = 3)

    return game(g1, g2) # 가위바위보하기


tc = int(input())

for idx in range(1, tc+1):
    n = int(input())
    cards = list(map(int, input().split()))

    print('#{} {}'.format(idx, tournament(0, n-1)+1))   # 카드는 1부터 시작이므로 +1 해주기

 

 

 

 

'Algorithm > SW Expert Academy' 카테고리의 다른 글

[Python] 1225. 암호생성기  (0) 2021.09.23
[Python] 4881. 배열 최소합  (0) 2021.09.21
[Python] 4875. 미로  (0) 2021.09.21
[Python] 4874. Forth  (0) 2021.09.21
[Python] 1224. 계산기3  (0) 2021.09.21