[SWEA][D3][#03499] 퍼펙트 셔플

작성:    

업데이트:

카테고리:

태그: , ,

출처

학습용 포스트입니다. 본 포스트가 문제가 될 시 수정 또는 삭제하겠습니다.


문제

카드를 퍼펙트 셔플 한다는 것은, 카드 덱을 정확히 절반으로 나누고 나눈 것들에서 교대로 카드를 뽑아 새로운 덱을 만드는 것을 의미한다.

정확한 방식은 다음 그림과 같다.

사진 생략

N개의 카드가 있는 덱이 주어질 때 이를 퍼펙트 셔플하면 어떤 순서가 되는지 출력하는 프로그램을 작성하라.

만약 N이 홀수이면, 교대로 놓을 때 먼저 놓는 쪽에 한 장이 더 들어가게 하면 된다.


입력

첫 번째 줄에 테스트 케이스의 수 T가 주어진다.

각 테스트 케이스의 첫 번째 줄에는 자연수 N(1 ≤ N ≤ 1,000)이 주어진다.

두 번째 줄에는 덱에 카드가 놓인 순서대로 N개의 카드 이름이 공백으로 구분되어 주어진다.

카드의 이름은 알파벳 대문자와 ‘-’만으로 이루어져 있으며, 길이는 80이하이다.


출력

각 테스트 케이스마다 주어진 덱을 퍼펙트 셔플한 결과를 한 줄에 카드 이름을 공백으로 구분하여 출력한다.


예제

입력

3
6
A B C D E F
4
JACK QUEEN KING ACE
5
ALAKIR ALEXSTRASZA DR-BOOM LORD-JARAXXUS AVIANA


출력

#1 A D B E C F
#2 JACK KING QUEEN ACE
#3 ALAKIR LORD-JARAXXUS ALEXSTRASZA AVIANA DR-BOOM


My Sol

T = int(input())
for tc in range(1, T+1):
    N = int(input())
    arr = list(input().split())
    mid = (N+1)//2
    lst = []
    for _ in range(mid):
        lst.append(arr.pop(0))

    ans = []
    while lst and arr:
        ans.append(lst.pop(0))
        ans.append(arr.pop(0))

    if lst:
        ans.append(lst.pop(0))

    print(f'#{tc}', *ans)

최초 입력은 arr로 받는데, 앞에서부터 하나하나 빼서 빈 리스트인 lst 변수에 채워넣는다. 이때 (N+1)//2로 계산된 mid를 range(mid)로 한다. 이 각 수들은 만약 N이 홀수라면 lst 변수에 항목이 하나가 더 많게 하기 위해서 경험적으로 조작해준 것이다.

이후 답을 담을 빈 리스트 ans를 만들고, lst와 arr이 모두 차있는동안 앞에서부터 하나하나 빼서 ans 리스트에 순서대로 넣어준다. 이때 N이 짝수라면 둘 다 딱 맞게 떨어져 비우겠지만, N이 홀수라면 lst에 항목이 하나 남아있다. 이를 판별하기 위한 if문을 while문 종료 후에 한 번 실행해주고, 결과 리스트인 ans를 unpacking하여 출력 형식에 맞춰 출력하면 되겠다.


결과

PASS

댓글남기기