본문 바로가기
TIL - 프로그래밍/Python 알고리즘

[SWEA] 3499. 퍼펙트 셔플 - Python

by chaemj97 2022. 2. 24.
728x90

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

 

SW Expert Academy

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

swexpertacademy.com

 

< 📝 문제 >

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

 

드는 것을 의미한다. 

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


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

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


< ❓ 생각 >
1.

2.


< 💻 코드 >

1.

# 테스트 케이스의 개수
T = int(input())
for tc in range(1,T+1):
    # N장의 카드
    N = int(input())
    card = input().split()

    result = ['']*len(card)
    # 홀수 장
    if N%2:
        for i in range(N//2+1):
            result[2*i] = card[i]
        for i in range(N//2):
            result[2*i+1] = card[i+N//2+1]
    # 짝수 장
    else:
        for i in range(N//2):
            result[2*i] = card[i]
            result[2*i+1] = card[i+N//2]

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

2.

# 테스트 케이스의 개수
T = int(input())
for tc in range(1,T+1):
    # N장의 카드
    N = int(input())
    card = input().split()
    
    st_idx1 = 0
    st_idx2 = (N+1)//2
    print(f'#{tc}',end=' ')
    
    for i in range(st_idx2):
        print(card[st_idx1+i],end=' ')
        # 마지막 값 입력 안함
        if st_idx2+i < N:
            print(card[st_idx2+i],end=' ')
    print()


< ❗ >

응용

1.

if N%2:
    idx2 = N//2+1
else:
    idx2 = N//2
idx2 = (N+1)//2

2. n 순환 0->1->2->3->0

n = (n+1)%4

3. 1->0, 0->1

n = (n+1)%2
728x90
반응형

댓글