• 첫째 줄에 몇 번 섞어야 하는지 출력한다. 만약, 섞어도 섞어도 카드를 해당하는 플레이어에게 줄 수 없다면, -1을 출력한다.
    • -1을 출력하는 기준을 무엇으로 잡을 것인가? => 카드를 섞으면 언젠가 원래 수열과 똑같이 돌아오는 사이클이 존재할 것이다.
import java.util.*;

public class Main {
	public static void main(String[] args) {
		Scanner in = new Scanner(System.in);
		int n = in.nextInt();
		int destination[] = new int[n];
		int shuffle[] = new int[n];
		int cards[] = new int[n];

		for (int i = 0; i < n; i++) {
			destination[i] = in.nextInt();
			cards[i] = destination[i];
		}
		for (int i = 0; i < n; i++) {
			shuffle[i] = in.nextInt();
		}

		int index = 0;
		while (true) {
			if (isPossible(cards)) {
				break;
			}

			shuffleCards(cards, shuffle);
			index++;

			if (isSame(destination, cards)) {
				index = -1;
				break;
			}
		}
		System.out.println(index);
	}

	private static void shuffleCards(int[] destination, int[] shuffle) {
		int length = destination.length;
		int newDestination[] = new int[length];

		for (int i = 0; i < length; i++) {
			newDestination[shuffle[i]] = destination[i];
		}
		for (int i = 0; i < length; i++) {
			destination[i] = newDestination[i];
		}
		newDestination = null;
	}

	private static boolean isPossible(int[] destination) {
		for (int i = 0; i < destination.length; i++) {
			if (destination[i] != i % 3) {
				return false;
			}
		}
		return true;
	}

	private static boolean isSame(int[] destination, int[] cards) {
		for (int i = 0; i < destination.length; i++) {
			if (destination[i] != cards[i]) {
				return false;
			}
		}
		return true;
	}
}

'알고리즘 공부 > boj' 카테고리의 다른 글

boj 1981: 배열에서 이동  (0) 2021.01.17
boj 3745: 오름세  (0) 2021.01.15
boj 1153: 네 개의 소수  (0) 2021.01.10
boj 17182: 우주 탐사선  (0) 2021.01.10
boj 1655: 가운데를 말해요  (0) 2021.01.03

+ Recent posts