본문 바로가기
알고리즘 풀이/SW Expert Academy

[SWEA] 토너먼트 카드게임 (python)

by char_lie 2023. 2. 16.
반응형

SWEA Learning Club Stack2 6차시 문제

https://swexpertacademy.com/main/learn/course/subjectDetail.do?courseId=AVuPDN86AAXw5UW6&subjectId=AWOVIc7KqfQDFAWg 

 

SW Expert Academy

SW 프로그래밍 역량 강화에 도움이 되는 다양한 학습 컨텐츠를 확인하세요!

swexpertacademy.com

토너먼트 카드게임 문제

재귀를 활용하여 조건에 맞게 나눈 후, 문제 요구사항대로 짜가면 되는 문제

100% 내 생각으로 풀었는가?
→ X

문제에 대해 정확히 이해를 못해서 접근하기 어려웠던 점도 있고, 2개로 함수를 나눠서 풀면 쉽겠다는 접근을 생각하지 못했다.

정답코드

T = int(input())

def game(a,b):
    if card[a] == card[b]: #카드가 같으면
        return [min(a , b)] #번호 더 작은 쪽이 win
    elif abs(card[a] - card[b]) == 1: # a랑 b랑 차이가 1이면
        return [a] if card[a] > card[b] else [b] # a의 카드 숫자가 더크면 win a 아니면 b win
    elif abs(card[a] - card[b]) == 2: # a랑 b랑 차이가 2이면
        return [a] if card[a] < card[b] else [b] # a의 카드 숫자가 더작으면 win 아니면 b win

def group(n):
    if len(n) == 1: # 1개가 되면
        return n #n 반환
    middle = (len(n)-1) // 2 + 1 #조건대로 쪼개기
    group1 = n[:middle] #좌측 그룹
    group2 = n[middle:] #우측 그룹

    group1 = group(group1) #다시 좌측 그룹을 2개로 쪼개기
    group2 = group(group2) #다시 우측 그룹을 2개로 쪼개기
    return game(group1[0], group2[0]) #쪼개진 그룹을 게임 시켜 반환

for case in range(1,T+1):
    N = int(input())
    card = list(map(int, input().split()))
    x = [i for i in range(N)] #각 학생 번호
    print(f'#{case} {group(x)[0]+1}')

조건의 정확한 뜻이 짝수의 경우는 상관없는데 홀 수 일경우 왼쪽 > 오른쪽이게 가운데를 분할한 후에 다시 양쪽을 분할 하고, 각 인원이 1명이 되게 토너먼트 식 느낌으로 구성하라는 뜻이었다. 이말을 먼저 이해하지 못해서 구성하는데 너무 어려움을 겪었다.

대충 이런 구조가 되게 토너먼트를 구성하란 뜻


느낀점

가끔 백준도 그렇고 SWEA도 그렇고 문제 자체의 말을 이해 못해서 접근조차 못하는 경우가 요즘 늘어난거같다. 무엇보다 이 문제는 그림그려놓은것 처럼 쪼개라는 말만 이해한다면 쉽게 접근할 수 있는 문제였던거 같은데 그러지 못한게 너무 아쉬웠다. 다른사람의 코드를 참고하면서 그제서야 아! 이렇게 하란 뜻이구나 하고 뒤늦게 이해버렸다.

여러모로 아쉬움이 남는 문제😥

반응형

댓글