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