(TIL)rockPaperScissors

이인수·2020년 12월 14일
0

TIL

목록 보기
14/26

20.12.14 (Algorithms)rockPaperScissors

rockPaperScissors_알고리즘

가위바위보 게임은 2인 이상의 사람이 동시에 '가위, 바위, 보'를 외치고 동시에 가위, 바위 또는 보 중에서 한 가지를 의미하는 손 모양을 내밀어 승부를 결정짓는 게임이다. 세 판의 가위바위보 게임을 할 경우, 한 사람은 세 번의 선택(예. 가위, 가위, 보)을 할 수 있습니다. 세 번의 선택으로 가능한 모든 경우의 수를 구하는 함수를 작성합니다.

  • 2차원 배열(arr[i])을 리턴해야 합니다.
  • arr[i]는 전체 경우의 수 중 한 가지 경우(총 세 번의 선택)를 의미하는 배열입니다.
  • arr[i]는 'rock', 'paper', 'scissors' 중 한 가지 이상을 요소로 갖는 배열입니다.
  • arr[i].length는 3입니다.
  • 최종적으로 리턴되는 배열의 순서는 가중치 적용 정렬(Weighted Sort)을 따릅니다.
  • 중요도는 'rock', 'paper', 'scissors' 순으로 높습니다.
  • 쉽게 생각해 올림픽 순위 결정 방식을 참고하면 됩니다.
  • 금메달('rock')이 은메달('paper')보다 우선하고, 은메달('paper')이 동메달('scissors')보다 우선합니다.
  • 가위바위보 게임의 수를 나타내는 양의 정수 rounds가 주어질 경우, 해당 rounds 동안 선택할 수 있는 모든 경우의 수를 리턴하도록 함수를 작성해 보세요.

<입출력 예시>
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.마지막으로 결과값 리턴

Code

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;
};

0개의 댓글