코딩테스트/SWEA

[Python, 파이썬] SWEA 6808. 규영이와 인영이의 카드게임

알코딩 2024. 10. 22. 05:09

9라운드에 걸쳐서 게임을 했을 때, 규영이가 이기는 경우와 지는 경우가 총 몇 가지인지 구하는 문제.

 
 
 

[코드]


import itertools # 순열, 조합 계산을 위한 라이브러리

T = int(input()) # 테스트케이스 개수 T

for test_case in range(1, T+1):

    card = list(map(int, input().split())) # 규영이가 받은 9장의 카드
    other = list(set(range(1, 19))-set(card)) # 인영이가 받은 카드
    
    win = lose = 0 # 규영이 이기고, 지는 경우의 수

    # 서로 다른 9개 조합
    for n in itertools.permutations(other, 9): 

        player1 = player2 = 0 # 규영이, 인영이 점수

        for i in range(9):

            if (card[i] > n[i]): # 규영이 점수가 더 크면
                player1 += card[i] + n[i] # 규영이한테 점수

            else: player2 += card[i] + n[i] # 인영이한테 점수

        if (player1 > player2):
            win += 1 # 규영이가 승
        else: lose += 1 # 인영이가 승

    print("#%d %d %d" %(test_case, win, lose))
 

 

 

 

[문제풀이]


 

우선 이 문제는 파이썬으로 풀 수 없는 문제다.

시간 초과를 떠나서 아예 언어 선택에 파이썬 자체가 없다.

 

 

 

우선, 18개의 카드 더미에서 규영이가 받은 카드를 빼서 인영이가 받은 카드를 구한다.

other = list(set(range(1, 19))-set(card)) # 인영이가 받은 카드
 

이건 차집합을 구하는 연산을 사용하였다.

 

itertools.permutations(other, 9)
 

그 후, itertools의 permutations 연산으로 9개의 카드에서 9개의 카드를 빼는 모든 조합을 구한 다음에 각 조합마다 정해진 규영이의 순서와 계산해 라운드를 계산해 지는 경우, 이기는 경우를 각각 구해주면 된다.