코딩테스트/백준

[백준]1091번 카드 섞기 - Java

GAEBAL 2022. 3. 3. 23:40
728x90

문제

https://www.acmicpc.net/problem/1091

 

1091번: 카드 섞기

지민이는 카지노의 딜러이고, 지금 3명의 플레이어(0, 1, 2)가 있다. 이 게임은 N개의 카드를 이용한다. (0 ~ N-1번) 일단 지민이는 카드를 몇 번 섞은 다음에, 그것을 플레이어들에게 나누어 준다. 0

www.acmicpc.net

 

풀이

문제를 처음 읽었을 때는 뭔소린지 모르겠었는데 몇번 더 읽다보니까 이해를 했음

문제에서 주어진 순서대로 카드를 섞고 섞을 때마다 정답과 비교해서 정답과 같은 순서로 카드가 섞였다면 그때의 count를 출력하면 됨

 

내 생각에 포인트는 언제 -1을 출력해야 되냐 인 듯???

 

계속해서 섞다가 한번도 섞지 않았을 때(초기 상태)와 같은 순서로 카드가 나왔을 경우를 생각해보면, 섞을 수 있는 경우의 수를 다 해봐서 한바퀴를 다 돌렸는데도 정답이 나오지 않았다는 거니까 그때 -1을 출력하고 while(true){ }에서 break하면 됨!!

 

코드

// 1091번 카드 섞기
// https://www.acmicpc.net/problem/1091

package BAEKJOON;

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

public class Num1091_카드섞기 {
    public static void main(String[] args) throws NumberFormatException, IOException {
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        StringTokenizer st;
        int N = Integer.parseInt(br.readLine());
        int[] P = new int[N];
        int[] S = new int[N];
        int[] card = new int[N];
        int[] temp = new int[N];
        int[] firstCard = new int[N];


        int count = 0;

        // card 초기상태
        for (int i = 0; i < N; i++) {
            card[i] = i % 3;
            firstCard[i] = i % 3;
        }

        st = new StringTokenizer(br.readLine());
        for (int i = 0; i < N; i++) {
            P[i] = Integer.parseInt(st.nextToken());
        }

        st = new StringTokenizer(br.readLine());
        for (int i = 0; i < N; i++) {
            S[i] = Integer.parseInt(st.nextToken());
        }

        while (true) {
            boolean check = true;
            for (int i = 0; i < N; i++) { // card가 P와 같은지 확인
                // 다르면 false
                if (card[i] != P[i]) {
                    check = false;
                    break;
                }
            }
            // card와 P가 다를 경우
            if (!check) {
                for (int i = 0; i < N; i++) {
                    temp[i] = card[S[i]];
                }
                // 섞은 다음 배열 복사
                card = temp.clone();
                count++;
            } else { // card가 P와 같다면 cnt 출력.
                System.out.println(count);
                break;
            }

            // 계속 섞다가 처음 카드 배열이랑 같으면(= 한바퀴돈거)
            // 정답이 나올 수 없다는 뜻이기 때문에 -1 출력
            int num = 0;
            for (int i = 0; i < N; i++) {
                if (card[i] == firstCard[i]) {
                    num++;
                }
            }
            if (num == N) {
                System.out.println(-1);
                break;
            }

        }
    }
}
728x90