본문 바로가기

숨막히는 알고말고/문제 풀이

[SWEA] 퍼펙트 셔플

👀 문제 설명

문제

로그인해야 문제를 볼 수 있다.

 

✍🏻풀이

덱을 두 개 사용해서 카드를 절반씩 나눠 넣고, 덱에서 번갈아 가면서 카드를 빼면 된다.

카드가 홀수이면, 교대로 놓을 때 먼저 놓는 쪽에 한 장이 더 들어가야 하므로 카드가 홀수일 때, 짝수일 때로 나눈다.

카드가 홀수일 때는, 0부터 N / 2 까지 dequeA에 넣고, 이후에는 dequeB에 넣는다.

카드가 짝수일 때는, 0부터 N / 2 - 1 까지 dequeA에 넣고, 이후에는 dequeB에 넣는다.

 

코드

package swea;

// 퍼펙트 셔플 (https://swexpertacademy.com/main/code/problem/problemDetail.do?contestProbId=AWGsRbk6AQIDFAVW&categoryId=AWGsRbk6AQIDFAVW&categoryType=CODE&problemTitle=%ED%8D%BC%ED%8E%99%ED%8A%B8+&orderBy=FIRST_REG_DATETIME&selectCodeLang=ALL&select-1=&pageSize=10&pageIndex=1 )

import java.util.*;
import java.io.*;

public class SWEA_3499 {
	
	public static void main(String[] args) throws Exception {
		BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
		BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(System.out));
		StringTokenizer st;
		int T, N;
		Deque<String> dequeA = new LinkedList<>();
		Deque<String> dequeB = new LinkedList<>();
		
		T = Integer.parseInt(br.readLine());
		
		for (int tc = 1; tc <= T; tc++) {
			N = Integer.parseInt(br.readLine());
			st = new StringTokenizer(br.readLine());
			
			for (int i = 0; i < N; i++) {
				if (N % 2 == 0) {
					if (i < N /2)
						dequeA.add(st.nextToken());
					else
						dequeB.add(st.nextToken());
				}
				else {
					if (i <= N /2)
						dequeA.add(st.nextToken());
					else
						dequeB.add(st.nextToken());
				}
			}
			
			bw.write("#" + tc + " ");
			while (true) {
				if (dequeA.isEmpty() && dequeB.isEmpty())
					break;
				
				if (!dequeA.isEmpty())
					bw.write(dequeA.poll() + " ");
				if (!dequeB.isEmpty())
					bw.write(dequeB.poll() + " ");
			}
			bw.newLine();
		}
		
		bw.flush();
		bw.close();
	}

}

'숨막히는 알고말고 > 문제 풀이' 카테고리의 다른 글

[Baekjoon] 체스판 다시 칠하기  (0) 2021.08.08
[SWEA] 정사각형 방  (0) 2021.08.06
[SWEA] 쇠막대기 자르기  (0) 2021.08.05
[Baekjoon] 탑  (2) 2021.08.05
[SWEA] 암호생성기  (0) 2021.08.05