백준/Java

[백준 1091] 카드 섞기 - JAVA

SH3542 2024. 9. 4. 12:07

BOJ Link

 

 

풀이 과정

단순 구현 문제이며 시간은 널널하다.

다소 이해가 힘든 문제를 파악하고, 카드를 섞는 방법을 코드로 표현하는 것에 중점을 둔 문제같다.

 

origin, next, now, goal, suffle 5개의 배열을 사용한다. cnt는 카드를 섞은 횟수이다.

 

origin - 초기 카드 상태

next - 카드를 섞은 이후 카드 상태

now - 현재 카드 상태

goal - 목표 카드 상태

suffle - 카드를 섞는 패턴

 

각 배열의 초기화 이후, 다음과 같은 과정을 반복한다.

 

1. goal과 now를 비교하여 같다면 cnt 출력

 

2. cnt != 0이고, origin과 now를 비교하여 같다면 -1 출력

(한 싸이클을 돌고나서도 초기 상태와 같아진다면 정답이 될 수 없다.)

 

3. suffle 배열에 따라 now를 섞어 next에 저장한 후, now를 next로 덮어씌움

 

4. cnt 1증가

 

 

핵심은 다음과 같다.

 

1. 목표를 달성해야할 수열 goal은 3보다 작은 값 [0-2]만 다루므로, 0~N-1의 값을 mod 3하여 사용한다.

=> 해당 카드가 몇 번째 카드인지는 알 필요 없다. 어떤 플레이어에게 나누어 줄 카드인지만 알면 된다.

 

2. 카드를 섞는 방법

=> next의 i번째에 now의 suffle[i]번째 카드가 와야한다.

next[i] = now[suffle[i]];

 

제출 코드

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

class Main {
    public static void main(String[] args) throws IOException {

        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        int N = Integer.parseInt(br.readLine());
        int mod = 3;
        int cnt = 0;

        int[] next = new int[N];
        int[] origin = new int[N];
        int[] now = new int[N];
        int[] suffle;
        int[] goal;

        for (int i = 0; i < N; i++) {
            int v = i % mod;
            origin[i] = v;
            now[i] = v;
        }

        goal = Arrays.stream(br.readLine().split(" ")).mapToInt(Integer::parseInt).toArray();
        suffle = Arrays.stream(br.readLine().split(" ")).mapToInt(Integer::parseInt).toArray();

        while (true) {
            if (isSame(now, goal, N)) {
                break;
            }
            if (cnt != 0 && isSame(origin, now, N)) {
                cnt = -1;
                break;
            }

            for (int i = 0; i < N; i++) {
                next[i] = now[suffle[i]];
            }

            for (int i = 0; i < N; i++) {
                now[i] = next[i];
            }

            cnt++;
        }

        System.out.println(cnt);
    }

    static boolean isSame(int[] a, int[] b, int N) {

        for (int i = 0; i < N; i++) {
            if (a[i] != b[i]) return false;
        }

        return true;
    }
}

'백준 > Java' 카테고리의 다른 글

[백준 1241] 머리 톡톡 - JAVA  (0) 2024.09.08
[백준 1099] 알 수 없는 문장 - JAVA  (0) 2024.09.05
[백준 1239] 차트 - JAVA  (0) 2024.07.27
[백준 1245] 농장 관리 - JAVA  (2) 2024.07.22
[백준 1202] 보석 도둑 - JAVA  (0) 2024.07.20