파이썬 알고리즘

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

뜻 지, 깨달음 오 2022. 10. 25. 09:10

https://swexpertacademy.com/main/code/problem/problemDetail.do?contestProbId=AWGsRbk6AQIDFAVW 

 

SW Expert Academy

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

swexpertacademy.com

 

위 그림에 나온 단계 순서대로 알고리즘을 짰다

1) 카드 덱을 절반으로 나워서 각자 다른 리스트에 넣는다.

T = int(input())
 
for tc in range(1, 1+T):
    n = int(input())
    arr = list(input().split())
 
    result = []
 
    shuffle_bottom = arr[:((n-1)//2)+1]
    shuffle_top = arr[((n-1)//2)+1: ]

이때 주의할 점

카드 덱에서 총 카드의 수는 짝수일수도, 홀수일수도 있기 때문에

((n-1)//2)+1

를 사용해준다.

그냥 2로 나누면 안됨!

 

 

2) 리스트 2개에서 한 카드씩 빼면서 새로운 리스트 (result)에 append 한다.

아까 1번 경우에서 만든 2개의 리스트에서 항상 shuffle_bottom이 top보다 len가 길게 된다.

따라서 while shuffle_bottom을 해주고,

bottom>top>bottom>top>bottom>top>bottom>top>... 이렇게 한장씩 pop해주고 

result에 append하면 된다.

    while shuffle_bottom:
        a = shuffle_bottom.pop(0)
        result.append(a)
        if shuffle_top:
            b = shuffle_top.pop(0)
            result.append(b)

 

 

전체 코드)

T = int(input())
 
for tc in range(1, 1+T):
    n = int(input())
    arr = list(input().split())
 
    result = []
 
    shuffle_bottom = arr[:((n-1)//2)+1]
    shuffle_top = arr[((n-1)//2)+1: ]
 
    while shuffle_bottom:
        a = shuffle_bottom.pop(0)
        result.append(a)
        if shuffle_top:
            b = shuffle_top.pop(0)
            result.append(b)
 
 
 
    print(f'#{tc}', end=' ')
    for i in range(len(result)):
        print(result[i], end=' ')
    print()​