TIL. rockPaperScissors

const_yang·2021년 12월 19일
0

TIL

목록 보기
8/14
post-thumbnail

- 문제:

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

- 입출력예시

let output = rockPaperScissors();

console.log(output);
/*
    [
      ["rock", "rock", "rock"],
      ["rock", "rock", "paper"],
      ["rock", "rock", "scissors"],
      ["rock", "paper", "rock"],
      // ...etc ...
    ]
  */

- 해석

중복 순열 문제이다. 3개 옵션의 수로 만들 수 있는 3자리 수는 3^3가지이다.

- 풀이

function rockPaperScissors (rounds) {
  rounds = rounds || 3;
  
  // 가위.바위.보 경기에서 우리는 아래 세 가지 중 하나를 낼 수 있다.
  const rps = ['rock', 'paper', 'scissors'];
  // 모든 경우를 취합하는 배열이다.
  const result = [];
  // 하고자 하는 게임 수에 도달하면, 만들어진 하나의 경우를 result 배열에 넣는다.
  const round = 0;
  
  
  const aux = (permutation, round) => {
    // 3판의 경기를 한다고 하면 3판 동안 어떤 경우가 나올 수 있는지 확인하기 위해 만든 조건이다.
    if (rounds === round) {
      result.push(permutation);
      return // 재귀 종료 => 아래 for문의 재진행을 의미한다.
    }

    for (let i=0; i < rps.length; i++) {
      // 첫 번째 item ('Rock')이 우리가 만들 경우에 처음 들어간다.
      // aux(['Rock'], 1)의 재귀가 일어난다. 결과는,
      // aux(['Rock', 'Rock'], 2) 재귀이다. 결과는,
      // aux(['Rock', 'Rock', 'Rock], 3) 재귀이다.
      // 탈출 조건에 도달하면 result에 추가하고 재귀 종료한다.
      // for문에 따라 aux(['Rock', 'Rock', 'paper'], 3) 재귀를실행한다.
      // 재귀에 의한 for문이 마치면,
      // 앞선 for문에 따라 aux(['Rock', 'Paper'], 2) 재귀를 실행한다.
      let newPer = permutation.concat(rps[i]);
      aux(newPer, round + 1);
    }
  }
  aux([], round);
  return result
};

0개의 댓글