본문 바로가기

코딩테스트/SWEA

[Python, 파이썬] SWEA 3499. 퍼펙트 셔플

N개의 카드가 있는 덱이 주어질 때 이를 퍼펙트 셔플하면 어떤 순서가 되는지 구하는 문제.

 

 

카드를 퍼펙트 셔플 한다는 것은, 카드 덱을 정확히 절반으로 나누고 나눈 것들에서 교대로 카드를 뽑아 새로운 덱을 만드는 것을 의미한다. 주어진 카드를 페퍽트 셔플해 새로운 덱을 만들때 어떤 순서가 되는지 구한다.

 

이때 N이 홀수일 시, 먼저 놓는 카드에 한장 더 가게 한다.

 

 

import math

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

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

    N = int(input()) # 카드 개수 N
    card = input().split() # N개의 카드 이름
    suffle = []

    # 카드 덱 나누기
    num = math.ceil(N/2)
    top = card[:num] # 왼쪽 덱
    bottom = card[num:] # 오른쪽 덱

    # 카드 덱 셔플하기
    for i in range(N//2):

        suffle.append(top[i]) # 왼쪽 덱
        suffle.append(bottom[i]) # 오른쪽 덱

    suffle += top[i+1:] # 카드가 홀수일 시 남은 카드


    print("#%d %s" %(test_case, ' '.join(suffle)))
 

 

[문제풀이]


 

우선 카드 덱을 나눈다.

num = math.ceil(N/2)

top = card[:num] # 왼쪽 덱
bottom = card[num:] # 오른쪽 덱
 

이때 카드덱은 홀수일 시 먼저 놓은 카드 덱, top이 한개 더 많아야 한다.

그래서 2로 나눈값을 올림하고 그걸 기점으로 리스트를 슬라이싱 해 카드 덱을 2개로 나눴다.

 

그리고 for문을 돌려 왼쪽 덱, 오른쪽 덱 하나씩 넣어서 셔플!

suffle += top[i+1:] # 카드가 홀수일 시 남은 카드
 

그리고 이렇게 왼쪽 덱에 남은 카드가 있으면 그걸 셔플한 카드덱에 넣어주면, 페펙트 셔플한 카드가 된다.