가위바위보의 경우의 수를 구하는 문제에 도대체 어떻게 접근해야할지 감이 안잡혀
help desk에 물어본 결과 아래와 같은 좋은 답변을 받을 수 있었다..!
그래서, 엔지니어분의 말씀 처럼 rockPaperScissors(0), rockPaperScissors(1), rockPaperScissors(2), rockPaperScissors(3)의 결과를 직접 써보면서 규칙을 찾기 시작했다.
정말로 말씀하신대로 나열된 전체 결과를 눈으로 확인해보니 손도 못대는 정도에서는 벗어날 수 있었다..!!
rockPaperScissors(0) = [[], [], []]
rockPaperScissors(1) = [ [ 'rock' ], [ 'paper' ], [ 'scissors' ] ]
rockPaperScissors(2) = [ [ 'rock', 'rock' ],
[ 'rock', 'paper' ],
[ 'rock', 'scissors' ],
[ 'paper', 'rock' ],
[ 'paper', 'paper' ],
[ 'paper', 'scissors' ],
[ 'scissors', 'rock' ],
[ 'scissors', 'paper' ],
[ 'scissors', 'scissors' ] ]
* rockPaperScissors(3) =
[["rock","rock","rock"],["rock","rock","paper"],
["rock","rock","scissors"],["rock","paper","rock"],
["rock","paper","paper"],["rock","paper","scissors"],
["rock","scissors","rock"],["rock","scissors","paper"],
["rock","scissors","scissors"],["paper","rock","rock"],
["paper","rock","paper"],["paper","rock","scissors"],
["paper","paper","rock"],["paper","paper","paper"],
["paper","paper","scissors"],["paper","scissors","rock"],
["paper","scissors","paper"],["paper","scissors","scissors"],
["scissors","rock","rock"],["scissors","rock","paper"],
["scissors","rock","scissors"],["scissors","paper","rock"],
["scissors","paper","paper"],["scissors","paper","scissors"],
["scissors","scissors","rock"],["scissors","scissors","paper"],
["scissors","scissors","scissors"]]
*/
바로 전 결과값 배열을 순회하여 각각의 요소에 접근한 뒤 접근한 요소에 "rock", "paper", "scissors"를 각각 하나씩 연결시켜 새로운 배열을 만들어 새로운 공간에 넣어준다.
바로 전 결과값은 순회용으로만 사용하고 현재 결과값은 새로운 공간에 만들어줘야 한다.
예시)
rockPaperScissors(1)일때 => [ 'rock']
rockPaperScissors(2)일때 => [ 'rock', 'rock' ], [ 'rock', 'paper' ], [ 'rock', 'scissors' ]
rockPaperScissors(3)일때 => [ 'rock', 'rock', 'rock'], [ 'rock', 'rock', 'paper'], [ 'rock', 'rock', 'scissors']
이렇게 숫자가 늘어날때마다 각 요소에 rock, paper, scissors가 붙어서 3배로 늘어난다.
var rockPaperScissors = function(number) {
let basic = ["rock", "paper", "scissors"];
let storage = [];
if (number === undefined) {
number = 3;
}
let check = function(count) {
let newStorage = [];
if (count === 0) {
basic.forEach(elem => storage.push([]));
} else if (count === 1) {
storage.forEach((elem, idx) => elem.push(basic[idx]));
} else {
storage.forEach(elem => {
basic.forEach(item => newStorage.push(elem.concat(item)));
storage = newStorage;
});
}
if (number === count) {
return;
}
check(count + 1);
};
check(0);
return storage;
};
var rockPaperScissors = function(rounds) {
var sequences = [];
var plays = ['rock', 'paper', 'scissors'];
var generate = function(sequence, round) {
// Base case:
if (round === rounds) {
sequences.push(sequence);
} else {
plays.forEach(function(play) {
generate(sequence.concat(play), round + 1);
});
}
};
generate([], 0);
return sequences;
};
0일때 => [[]]
1일때 => [['rock'], ['paper'], ['scissors']]
2일때 => [['rock', 'rock'], ['rock', 'paper'], ['rock', 'scissors'], ['paper', 'rock'], ['paper', 'paper'], ['paper', 'scissors'], ['scissors', 'rock'], ['scissors', 'paper'], ['scissors', 'scissors'] ]
[]
빈배열부터 시작한다. 숫자 : 0[]
에 연결시켜준 후 그것을 재귀함수의 첫번째 인자로 넣고 두번째 인자인 숫자에 +1을 하여 재귀함수를 실행한다.