[백준] 16986: 인싸들의 가위바위보 - JAVA
https://www.acmicpc.net/problem/16986
풀이
구현문제.
승패가 주어지고, 각각 어떤 어떤 동작을 할지 알려준다.
승패 테이블을 이용해 승,패를 판단하는 문제.
지우가 다른 동작들을 내면서 K승을 쌓으면 성공이다.
지우가 낼 동작을 순열을 통해 작성하고 게임을 진행한다.
지우가 K승 이상 쌓으면 true,
지우가 N번 이상 동작을 하면 같은 동작을 다시 내는 것이므로 false,
경희나 민호가 K승 이상 쌓으면 false이다.
메모리: 37796KB
시간: 248ms
언어: Java 11
코드
import java.io.*;
import java.util.*;
public class Main {
static int N, K;
static int[][] table;
static int[] kyunghee, minho, jiwoo, win, idx;
static boolean[] visit;
static boolean flag;
public static void main(String[] args) throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
StringTokenizer st = new StringTokenizer(br.readLine());
N = Integer.parseInt(st.nextToken());
K = Integer.parseInt(st.nextToken());
table = new int[N + 1][N + 1];
for (int i = 1; i < N + 1; i++) {
st = new StringTokenizer(br.readLine());
for (int j = 1; j < N + 1; j++) {
table[i][j] = Integer.parseInt(st.nextToken());
}
}
kyunghee = new int[20];
st = new StringTokenizer(br.readLine());
for (int i = 0; i < 20; i++) {
kyunghee[i] = Integer.parseInt(st.nextToken());
}
minho = new int[20];
st = new StringTokenizer(br.readLine());
for (int i = 0; i < 20; i++) {
minho[i] = Integer.parseInt(st.nextToken());
}
flag = false;
jiwoo = new int[N + 1];
visit = new boolean[N + 1];
makeJiwoo(0);
System.out.println(flag ? 1 : 0);
}
private static void makeJiwoo(int cnt) {
if (flag) {
return;
}
if (cnt == N) {
win = new int[3];
idx = new int[3];
game(0, 1);
return;
}
for (int i = 1; i < N + 1; i++) {
if (visit[i]) {
continue;
}
visit[i] = true;
jiwoo[cnt] = i;
makeJiwoo(cnt + 1);
visit[i] = false;
}
}
private static void game(int a, int b) {
if (win[0] >= K) {
flag = true;
return;
}
if (idx[0] >= N || win[1] >= K || win[2] >= K) {
return;
}
int nextPlayer = 0;
for (int i = 0; i < 3; i++) {
if (a != i && b != i) {
nextPlayer = i;
break;
}
}
int p1 = 0;
switch (a) {
case 0:
p1 = jiwoo[idx[0]++];
break;
case 1:
p1 = kyunghee[idx[1]++];
break;
case 2:
p1 = minho[idx[2]++];
}
int p2 = 0;
switch (b) {
case 0:
p2 = jiwoo[idx[0]++];
break;
case 1:
p2 = kyunghee[idx[1]++];
break;
case 2:
p2 = minho[idx[2]++];
}
int result = table[p1][p2];
if (result == 2) {
win[a]++;
game(a, nextPlayer);
} else if (result == 0) {
win[b]++;
game(nextPlayer, b);
} else {
if (a > b) {
win[a]++;
game(a, nextPlayer);
} else {
win[b]++;
game(nextPlayer, b);
}
}
}
}