가위바위보 게임은 2인 이상의 사람이 동시에 '가위, 바위, 보'를 외치고 동시에 가위, 바위 또는 보 중에서 한 가지를 의미하는 손 모양을 내밀어 승부를 결정짓는 게임입니다. 세 판의 가위바위보 게임을 할 경우, 한 사람은 세 번의 선택(예. 가위, 가위, 보)을 할 수 있습니다. 세 번의 선택으로 가능한 모든 경우의 수를 구하는 함수를 작성합니다.
이 문제는 중복순열을 사용해서 풀어야 하는 알고리즘 문제이다. 아래 코드는 레퍼런스를 참고하여 한번 더 풀어본 코드이다.
function game (rounds) {
// 총 3개의 선택지가 있기 때문에 배열로 나열해준다.
let games = ["rock", "paper", "scissors"];
// 결과를 담을 배열
let result = [];
// rounds는 입력 받을 판 수이며, rounds에 어떠한 값이 들어오면 rounds를 rounds로 , 아니면 3을 넣어준다.
rounds = rounds || 3;
// 재귀 함수를 만든다.
let permutate = (roundsLeft, bucket) => {
// 재귀 함수 탈출 조건
// 여기서 roundsLeft 인자로 판 수, bucket으로 빈 배열을 입력 받는다.
// 만약, 판 수가 0이 되면, result에 bucket을 넣어주고 함수를 빠져나온다.
if (roundsLeft === 0) {
result.push(bucket);
return;
}
// games에 총 선택지가 있으니 games만큼 반복한다.
for (let i = 0; i < games.length; i++) {
// games의 요소들을 반복해서 대입한다.
let current = games[i];
// permutate함수를 재귀로 사용한다.
// 인자로 roundsLeft에 -1한 값을 넣고, bucket은 current, 즉 rock이 들어온다.
// 중복된 값도 들어올 수 있기 때문에 i가 0일 때, rounds가 0이 될때까지 반복한다.
// rounds가 3이라고 한다면, rounds가 0이 되려면 3번 반복해야 한다.
// 그 반복이 완료되어야 i는 1이 증가하고, 1이 된 i로 다시 current에 대입해서 이어간다.
permutate(roundsLeft - 1, bucket.concat(current));
}
}
permutate(rounds, []);
return result;
};