가위바위보 게임은 2인 이상의 사람이 동시에 '가위, 바위, 보'를 외치고 동시에 가위, 바위 또는 보 중에서 한 가지를 의미하는 손 모양을 내밀어 승부를 결정짓는 게임입니다. 세 판의 가위바위보 게임을 할 경우, 한 사람은 세 번의 선택(예. 가위, 가위, 보)을 할 수 있습니다. 세 번의 선택으로 가능한 모든 경우의 수를 구하는 함수를 작성합니다.
2차원 배열(arr[i])을 리턴해야 합니다.
arr[i]는 전체 경우의 수 중 한 가지 경우(총 세 번의 선택)를 의미하는 배열입니다.
arr[i]는 'rock', 'paper', 'scissors' 중 한 가지 이상을 요소로 갖는 배열입니다.
arr[i].length는 3
최종적으로 리턴되는 배열의 순서는 가중치 적용 정렬(Weighted Sort)을 따릅니다.
중요도는 'rock', 'paper', 'scissors' 순으로 높습니다.
쉽게 생각해 올림픽 순위 결정 방식을 참고하면 됩니다.
금메달('rock')이 은메달('paper')보다 우선하고, 은메달('paper')이 동메달('scissors')보다 우선합니다.
let output = rockPaperScissors();
console.log(output);
/*
[
["rock", "rock", "rock"],
["rock", "rock", "paper"],
["rock", "rock", "scissors"],
["rock", "paper", "rock"],
// ...etc ...
]
*/
3중 for문을 통한 순열 방법을 사용해 결과를 리턴하자.
추가적으로 재귀를 활용해 많은 횟수의 가위바위보를 하는 경우를 고려해보자.
function rockPaperScissors(rounds=3) {
// TODO: 여기에 코드를 작성합니다.
let result = []
let game = ["rock", "paper", "scissors"]
//3중 for문 풀이
// for (let i = 0; i < game.length; i++) {
// for (let j = 0; j < game.length; j++) {
// for (let k = 0; k < game.length; k++) {
// result.push([game[i], game[j], game[k]])
// }
// }
// }
// return result
function recursion(count,bucket){
//재귀 탈출조건
if(count === 0){
result.push(bucket)
return;
}
for(let i=0;i<game.length;i++){
let pick = game[i]
recursion(count-1,bucket.concat(pick))
}
}
recursion(rounds,[])
return result
};
3중 for문으로도 해결할 수 있지만,
게임횟수가 수십회로 증가할 경우 for문을 쓰는 것은 매우 비효율 적이다. 재귀를 사용할 때 또 다른 재귀가 실행되기 때문에 for문이 stack에
계속 쌓인다는 것을 손으로 코드를 직접적으며 결과값을 예상해보니 파악할 수 있었다. 병합정렬 알고리즘에서도 경험했던 것인데 까먹지 않도록
계속 봐야겠다.