가위바위보 게임은 2인 이상의 사람이 동시에 '가위, 바위, 보'를 외치고 동시에 가위, 바위 또는 보 중에서 한 가지를 의미하는 손 모양을 내밀어 승부를 결정짓는 게임입니다. 세 판의 가위바위보 게임을 할 경우, 한 사람은 세 번의 선택(예. 가위, 가위, 보)을 할 수 있습니다. 세 번의 선택으로 가능한 모든 경우의 수를 구하는 함수를 작성합니다.
let output = rockPaperScissors();
console.log(output);
/*
[
["rock", "rock", "rock"],
["rock", "rock", "paper"],
["rock", "rock", "scissors"],
["rock", "paper", "rock"],
// ...etc ...
]
*/
중복 순열 문제이다. 3개 옵션의 수로 만들 수 있는 3자리 수는 3^3가지이다.
function rockPaperScissors (rounds) {
rounds = rounds || 3;
// 가위.바위.보 경기에서 우리는 아래 세 가지 중 하나를 낼 수 있다.
const rps = ['rock', 'paper', 'scissors'];
// 모든 경우를 취합하는 배열이다.
const result = [];
// 하고자 하는 게임 수에 도달하면, 만들어진 하나의 경우를 result 배열에 넣는다.
const round = 0;
const aux = (permutation, round) => {
// 3판의 경기를 한다고 하면 3판 동안 어떤 경우가 나올 수 있는지 확인하기 위해 만든 조건이다.
if (rounds === round) {
result.push(permutation);
return // 재귀 종료 => 아래 for문의 재진행을 의미한다.
}
for (let i=0; i < rps.length; i++) {
// 첫 번째 item ('Rock')이 우리가 만들 경우에 처음 들어간다.
// aux(['Rock'], 1)의 재귀가 일어난다. 결과는,
// aux(['Rock', 'Rock'], 2) 재귀이다. 결과는,
// aux(['Rock', 'Rock', 'Rock], 3) 재귀이다.
// 탈출 조건에 도달하면 result에 추가하고 재귀 종료한다.
// for문에 따라 aux(['Rock', 'Rock', 'paper'], 3) 재귀를실행한다.
// 재귀에 의한 for문이 마치면,
// 앞선 for문에 따라 aux(['Rock', 'Paper'], 2) 재귀를 실행한다.
let newPer = permutation.concat(rps[i]);
aux(newPer, round + 1);
}
}
aux([], round);
return result
};