[SWEA] 4880 토너먼트 카드게임

Yujin Jo·2022년 4월 5일
0

SWEA

목록 보기
21/22
post-thumbnail

문제 출처 : [SWEA] 4880 토너먼트 카드게임
learn -> course -> programming intermediate -> stack2 -> 토너먼트 카드게임

문제

사다리 게임이 지겨워진 알고리즘 반 학생들이 새로운 게임을 만들었다. 가위바위보가 그려진 카드를 이용해 토너먼트로 한 명을 뽑는 것이다. 게임 룰은 다음과 같다.

1번부터 N번까지 N명의 학생이 N장의 카드를 나눠 갖는다. 전체를 두 개의 그룹으로 나누고, 그룹의 승자끼리 카드를 비교해서 이긴 사람이 최종 승자가 된다.

그룹의 승자는 그룹 내부를 다시 두 그룹으로 나눠 뽑는데, i번부터 j번까지 속한 그룹은 파이썬 연산으로 두개로 나눈다.

두 그룹이 각각 1명이 되면 양 쪽의 카드를 비교해 승자를 가리고, 다시 더 큰 그룹의 승자를 뽑는 방식이다.

다음은 4명이 카드를 비교하는 경우로, 숫자 1은 가위, 2는 바위, 3은 보를 나타낸다. 만약 같은 카드인 경우 편의상 번호가 작은 쪽을 승자로 하고, 처음 선택한 카드는 바꾸지 않는다.

N명이 학생들이 카드를 골랐을 때 1등을 찾는 프로그램을 만드시오.

입력

첫 줄에 테스트 케이스 개수 T가 주어진다. 1≤T≤50

다음 줄부터 테스트 케이스의 별로 인원수 N과 다음 줄에 N명이 고른 카드가 번호순으로 주어진다. 4≤N≤100

카드의 숫자는 각각 1은 가위, 2는 바위, 3은 보를 나타낸다.

출력

각 줄마다 "#T" (T는 테스트 케이스 번호)를 출력한 뒤, 1등의 번호를 출력한다.

코드

# 가위, 바위, 보 판별 함수
def game(a, b):
    p1, p2 = tournament[a-1], tournament[b-1]   # 인덱스에 접근하기 위해 -1
    # 비겼을 경우 인덱스가 앞선 a를 return
    if p1 == p2:
        return a
    elif p1 == 1:
        if p2 == 2:
            return b
        else:
            return a
    elif p1 == 2:
        if p2 == 1:
            return a
        else:
            return b
    elif p1 == 3:
        if p2 == 1:
            return b
        else:
            return a


# 그룹에 1명이 될 때까지 계속 나누는 함수
def tournament_game(start, end):

    if start == end:        # 남은게 한명 밖에 없을 경우 그 한명의 위치를 return
        return start
    else:                   # 그 외의 경우에는 중앙값을 찾으면서 계속 범위를 좁혀나감
        mid = (start + end) // 2
        a = tournament_game(start, mid)
        b = tournament_game(mid + 1, end)
        return game(a, b)   # 각 그룹에 사람이 한 명이 되면 가위, 바위, 보 검사


T = int(input())
for tc in range(1, T + 1):
    N = int(input())
    tournament = list(map(int, input().split()))

    print(f'#{tc} {tournament_game(1, N)}')

풀이 방법

각 그룹에 한 명이 남을 때까지 나누는 함수와 가위바위보를 진행하는 함수 2개로 나누어서 문제를 풀이하였다. 전체 인원수의 절반을 기준으로 계속해서 그룹을 나누어 주었다. 그리고 더 이상 나눌 수 없을 때 가위바위보 함수를 호출하여 승자를 return해주었다.

profile
일단 해보자

0개의 댓글