SWEA

4880. [파이썬 S/W 문제해결 기본] 5일차 - 토너먼트 카드게임

Toproot 2021. 3. 3. 18:04
728x90
728x90

 

🚛 파이썬 SW문제해결 기본 - Stack2

가위바위보할 상대를 구할 때 주어진 카드 순서를 절반씩 나누어 토너먼트 형태로
시합 대진을 구성하는 문제입니다. 최종적으로 상대가 나눠지게 되면 가위바위보를 진행하고
최종적으로 승자를 가려내어 출력합니다.

 

 

💡 아이디어

     반복되는 작업을 함수와 재귀를 활용해서 해결합니다.
     범위를 둘로 나눌때 구간을 잘 나누어 주어야 겹치는 부분이 발생하지 않습니다.

 

🎲 파이썬 코드

※ SW Expert 아카데미의 문제를 무단 복제하는 것을 금지합니다.

# TODO 4880 토너먼트 가위바위보

def game(i, j):
    # 종료조건..점점 줄어들기 때문에 자신과 같아지면 i 출력
    if i == j:
        return i
    # 게임을 시키는 범위.
    # 범위를 둘로 나눠서 재귀를 돌림..
    aidx = game(i, (i+j)//2)
    bidx = game((i+j)//2+1, j)

    # 구해진 인덱스에 해당하는 값들끼리 가위바위보 후 최종적으로 인덱스(=번호)리턴.
    # winner(aidx,bidx)
    if arr[aidx] == 1: # 가위
        if arr[bidx] == 2: return bidx
        elif arr[bidx] == 3: return aidx
        elif arr[bidx] == 1: return aidx
    if arr[aidx] == 2: # 바위
        if arr[bidx] == 1: return aidx
        elif arr[bidx] == 3: return bidx
        elif arr[bidx] == 2: return aidx
    if arr[aidx] == 3: # 보
        if arr[bidx] == 1: return bidx
        elif arr[bidx] == 2: return aidx
        elif arr[bidx] == 3: return aidx

T = int(input())

for tc in range(1, T+1):
    N = int(input())
    # 인덱스 0을 고려하기 위해 더해주고 출력.
    arr = [0] + list(map(int,input().split()))
    print('#{}'.format(tc), end=' ')
    print(game(1, N))

* 제 코드가 정답은 아닙니다. 부족한 부분과 더 좋은 아이디어가 있으시면 댓글로 남겨주세요! :)

728x90
728x90