PS/Baekjoon Online Judge

[백준 08896] 가위 바위 보 [Java]

kimyoungrok 2025. 6. 6. 15:10
728x90

풀이

8896번: 가위 바위 보

 


풀이

N개의 로봇들이 가위바위보를 했을 때, 승리한 로봇의 번호를 출력하는 문제다.

난이도에 비해 구현 사항이 많다. 순서대로 구현해보자.

게임 시작 전 어떤 로봇들이 살아있는지 체크할 배열 isAlive를 선언 및 초기화 했다.

            // Solve
            boolean[] isAlive = new boolean[N];
            Arrays.fill(isAlive, true);

K는 한 로봇이 한 게임 동안 내는 경우와 같다.

N개의 로봇들이 각 라운드 별로 어떤 수를 냈는지 enable 배열로 확인해보자.

    private static int[] getEnableCheckArr(boolean[] isAlive, int K) {
        int[] enable = {0, 0, 0};
        final int N = isAlive.length;
        for (int i = 0; i < N; ++i) {
            if (!isAlive[i]) {
                continue;
            }
            switch (info[i][K]) {
                case 'R':
                    enable[0] = 1;
                    break;
                case 'S':
                    enable[1] = 1;
                    break;
                case 'P':
                    enable[2] = 1;
                    break;
            }
        }
        return enable;
    }
            final int K = info[0].length;
            for (int k = 0; k < K; ++k) {
                int[] enable = getEnableCheckArr(isAlive, k); 

만약 활성화된 경우가 2개 가 아니라면, 승부를 가릴 수 없다.

                if (enable[0] + enable[1] + enable[2] != 2) {
                    continue;
                }

여기까지 왔다면, 해당 라운드는 승패가 결정되었음을 의미한다.

패자는 더 이상 게임을 진행할 수 없으므로 제외하자.

코드를 간결하게 하기 위해 나오지 않는 수에 대해 역으로 해당 라운드의 패자를 유추했다.

public class Main {
    static char[][] info;
    static char[] simulationResult = {'P', 'R', 'S'};
    private static char getLoseChar(int[] enable) {
        for (int i = 0; i < 3; ++i) {
            if (enable[i] == 0) {
                return simulationResult[i];
            }
        }
        return 'X';
    }
                final char loseChar = getLoseChar(enable);

                for (int i = 0; i < N; ++i) {
                    if (info[i][k] == loseChar) {
                        isAlive[i] = false;
                    }
                }
            }

K라운드가 모두 끝난 후 승자가 1명인지 확인하자, 1명이 아니라면 0을 출력해야 한다.

            int idx = -1, cnt = 0;
            for (int i = 0; i < N; ++i) {
                if (isAlive[i]) {
                    ++cnt;
                    idx = i;
                }
            }
            sb.append(cnt != 1 ? 0 : idx + 1).append("\\n");
        }

풀이 시간

30분


소스코드

https://github.com/rogi-rogi/problem-solving/blob/main/baekjoon-online-judge/easy/08896.java

 

problem-solving/baekjoon-online-judge/easy/08896.java at main · rogi-rogi/problem-solving

Daily Problem Solving Challenges. Contribute to rogi-rogi/problem-solving development by creating an account on GitHub.

github.com

 

728x90