박스 나누기 게임은 두 박스를 이용해서 하는 게임이다.
처음에 한 박스에는 돌이 N개, 다른 박스에는 돌이 M개 들어있다. 두 사람은 턴을 번갈아가면서 게임을 진행한다.
각 사람은 박스를 하나 선택하고, 박스안에 들어있는 돌을 모두 비운다. 그 다음, 다른 박스에 들어있는 돌을 적절히 두 박스로 분배한다. 이때, 두 박스에는 돌이 적어도 1개 이상 있어야 한다.
두 박스에 돌을 각각 1개씩 만드는 사람이 게임을 이기게 된다.
N과 M이 주어진다. 두 사람이 게임을 완벽하게 했을 때, 이기는 사람을 구하는 프로그램을 작성하시오.
첫째 줄에 N과 M이 주어진다. (1 ≤ N, M ≤ 100, N과 M이 모두 1인 경우는 없다)
게임을 먼저 시작한 사람이 게임을 이기면 A를, 그 다음에 시작한 사람이 게임을 이기면 B를 출력한다.
1 2
A
const fs = require('fs');
let input = fs.readFileSync(0, 'utf-8').toString().trim().split(' ').map(Number);
let N = input[0];
let M = input[1];
let dp = Array.from({ length: 101 }, () => Array(101).fill(-1));
if (N > M) {
[N, M] = [M, N];
}
function recursion(x, y) {
if (x === 0 || y === 0 || x > y) {
return 0;
}
if (x === 1 && y === 1) {
return 2;
}
if (dp[x][y] !== -1) {
return dp[x][y];
}
dp[x][y] = 0;
for (let i = 1; i <= Math.floor(y / 2); i++) {
let temp = recursion(i, y - i);
if (temp === 0 || temp === 2) {
return (dp[x][y] = 1);
}
}
for (let i = 1; i <= Math.floor(x / 2); i++) {
let temp = recursion(i, x - i);
if (temp === 0 || temp === 2) {
return (dp[x][y] = 1);
}
}
return dp[x][y];
}
console.log(recursion(N, M) === 1 ? 'A' : 'B');
게임 이론 문제는 해당 결과가 승리했으니 나는 패배한다. 이런 경우가 너무 많아서 뇌가 꼬이는 것 같아. 게임 이론 문제...싫어...