20.12.14 (Algorithms)rockPaperScissors
<입출력 예시>
let output = rockPaperScissors(5);
console.log(output);
[
["rock", "rock", "rock", "rock", "rock"],
["rock", "rock", , "rock", "rock", "paper"],
["rock", "rock", , "rock", "rock", "scissors"],
["rock", "rock", "rock", "paper", "rock"],
["rock", "rock", "rock", "paper", "paper"],
["rock", "rock", "rock", "paper", "scissors"],
["rock", "rock", "rock", "scissors", "rock"],
// ...etc ...
]
가위,바위,보의 경우의수를 구하는데 rounds를 입력 받으면 round 수 만큼의 경우의 수를, 아니면 3만큼의 경우의 수를 구하는 알고리즘이다.
1.먼저 입력값이 주어질 경우(rounds)와 주어지지 않을 경우(3)를 같이 구현하기 위해 입력값(rounds)에 rounds || 3을 해준다.
2.'rock', 'paper', 'scissors' 가중치 적용을 위해 그대로 배열을 만들어줌.
3.결과값을 담을 빈 배열을 만들어주고,
4.재귀함수를 만들어
4-1.만약 재귀의 첫번째 인자가 0이면 빈 배열(결과값)에 두번째 인자를 담아 리턴.
4-2.가중치 적용한 배열의 길이만큼 반복문을 적용.
(1)가중치 적용 배열의 i 인덱스를 다른 곳에 저장.
(2)재귀함수(첫번째 인자에 1은 빼고, 두번째 인자는 가중치 적용 배열의 i 인덱스를 붙인다(concat))
4-3.재귀함수(rounds, [])
5.마지막으로 결과값 리턴
const rockPaperScissors = function (rounds) {
rounds = rounds || 3;// 3은 입력값 없을 때.
const rps = ['rock', 'paper', 'scissors']; // 가중치 적용. 순서대로 선언해 줬음.
const outcomes = [];
// 정렬해주는(?) 재귀를 돌면서 배열을 만들어 준다.
let permutate = function (roundsToGo, playedSoFar) {
if (roundsToGo === 0) {
outcomes.push(playedSoFar);
return;
}
for (let i = 0; i < rps.length; i++) {
let currentPlay = rps[i];
permutate(roundsToGo - 1, playedSoFar.concat(currentPlay));
}
};
permutate(rounds, []);
return outcomes;
};