Notice
Recent Posts
Recent Comments
Link
«   2025/06   »
1 2 3 4 5 6 7
8 9 10 11 12 13 14
15 16 17 18 19 20 21
22 23 24 25 26 27 28
29 30
관리 메뉴

으하하 공부일기

[SWEA] - 3499. 퍼펙트 셔플 (D3) 본문

SWEA/D3

[SWEA] - 3499. 퍼펙트 셔플 (D3)

0으하하0 2022. 5. 11. 00:23

[문제]

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

N개의 카드가 있는 덱이 주어질 때 이를 퍼펙트 셔플하면 어떤 순서가 되는지 출력하는 프로그램을 작성하라.
만약 N이 홀수이면, 교대로 놓을 때 먼저 놓는 쪽에 한 장이 더 들어가게 하면 된다.

[입력]
첫 번째 줄에 테스트 케이스의 수 T가 주어진다.
각 테스트 케이스의 첫 번째 줄에는 자연수 N(1 ≤ N ≤ 1,000)이 주어진다.
두 번째 줄에는 덱에 카드가 놓인 순서대로 N개의 카드 이름이 공백으로 구분되어 주어진다.
카드의 이름은 알파벳 대문자와 ‘-’만으로 이루어져 있으며, 길이는 80이하이다.

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

문제 풀기

3499. 퍼펙트 셔플

 


[풀이]

import java.util.Scanner;

class Solution {	
	public static void main(String[] args) throws Exception {
		Scanner sc = new Scanner(System.in);
		
		int t = sc.nextInt();
		
		for(int tc=1; tc<=t; tc++) {
			int n = sc.nextInt();
			
			String a[] = new String[n];
			String b[] = new String[n];
			
			for(int i=0; i<n; i++) a[i] = sc.next();
			
			int first = 0;
			int mid = 0;
			
			if(n%2==0) mid = n/2;
			else mid = (n/2)+1;
			
			for(int i=0; i<n; i++) {
				if((i+1)%2!=0) {
					b[i] = a[first];
					first++;
				}
				else {
					b[i] = a[mid];
					mid++;
				}
			}
			
			System.out.print("#" + tc + " ");
			for(int i=0; i<n; i++) System.out.print(b[i] + " ");
			System.out.println();
		}
		
	}
}