[SWEA]퍼펙트 셔플

onyoo·2023년 11월 28일
0

알고리즘

목록 보기
39/40

개요

문제링크

이렇게 풀어도 되나..? 싶었던 문제

문제분석

개개인마다 풀이는 다양할 것 같지만 링크드 리스트가 생각나서 링크드 리스트를 구현해서 풀어보았다.

처음에는 셔플을 여러번 하는 줄 알았는데 그건 아니었고 그냥 한번한 결과값을 출력해주면 되는 것이었다.

더불어 짝수일 경우와 홀수일 경우가 다르니 그걸 다르게 처리해주어야한다.

연결리스트의 경우 중간에 노드가 끼워지는게 용이하다. 이러한 점을 이용하여 반복문을 반만 순회하는 대신,첫번째와 반으로 나누었을때 그 이후 노드를 연결하는 작업을 반복한다.

그냥 연결작업 !

마지막으로는 연결한 노드들을 쭉 뽑아주는 작업을 했다.

문제풀이


import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.StringTokenizer;

/**
 * @author onyoo
 * @performance
 * @category
 * @note
 * @see
 * @since 11/28/23
 **/
public class Solution {
	static class Node{
		String value;
		Node node;

		public Node(String value, Node node) {
			this.value = value;
			this.node = node;
		}
	}
	static int T,N;
	static Node[] cards;
	public static void main(String[] args) throws IOException {
		BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
		StringBuilder sb = new StringBuilder();
		StringTokenizer st;

		T = Integer.parseInt(br.readLine());

		for(int t=1;t<T+1;t++){

			N = Integer.parseInt(br.readLine());

			cards = new Node[N];

			st = new StringTokenizer(br.readLine()," ");
			for(int i=0;i<N;i++){
				cards[i] = new Node(st.nextToken(),null);
			}
			if(cards.length % 2 == 0){
				for(int i=0;i<N/2;i++){
					if(i+1 < N/2) cards[i+N/2].node = cards[i+1];
					cards[i].node = cards[i+N/2];
				}
			}else{
				cards[0].node = cards[N/2+1];
				for(int i=1;i<(N/2)+1;i++){
					if(i < N/2) cards[i].node = cards[(i+N/2)+1];
					cards[i+N/2].node = cards[i];
				}
			}

			sb.append("#"+t+" ");
			for(Node card = cards[0]; card!=null;card = card.node){
				sb.append(card.value + " ");
			}
			sb.append("\n");
		}
		System.out.println(sb);
	}
}
profile
반갑습니다 ! 백엔드 개발 공부를 하고있습니다.

0개의 댓글