PS/Baekjoon Online Judge
[백준 08896] 가위 바위 보 [Java]
kimyoungrok
2025. 6. 6. 15:10
728x90
풀이
풀이
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