January 12, 2020
가위바위보의 경우의 수를 구하는 문제에 도대체 어떻게 접근해야할지 감이 안잡혀 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배로 늘어난다.
각 요소에 접근한뒤 rock, scissors, paper가 담긴 base를 각각 순회하여 현재 접근한 storage 요소에 연결시켜 새로운 저장공간에 push해 준다. 이과정을 result의 각각의 요소에서 반복한다. => concat 사용
새로운 저장공간을 만들어주는 이유?
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;
};
[[]]
[['rock'], ['paper'], ['scissors']]
[['rock', 'rock'], ['rock', 'paper'], ['rock', 'scissors'], ['paper', 'rock'], ['paper', 'paper'], ['paper', 'scissors'], ['scissors', 'rock'], ['scissors', 'paper'], ['scissors', 'scissors'] ]
generate([], 0)
=> 첫번째로 []
빈배열과 숫자 0을 인자로 넣고 재귀함수를 실행한다.[]
에 연결시켜준 후 그것을 재귀함수의 첫번째 인자로 넣고 두번째 인자인 숫자에 +1을 하여 재귀함수를 실행한다.역식 reference 코드는 이해가 쉽고 가독성이 좋다. 코드를 읽다보니 rockPaperScissors의 규칙이 눈에 보였다. 내 코드도 이해쉽고 가독성 좋은 코드가 되는 날이 오기를 바라며 비교 분석 열심히 해보았다.