중복조합_가위바위보

mingyu Lim·2023년 4월 6일

코딩테스트

목록 보기
19/32

문제

  • 총 사람의 수인 n을 받아 가위바위보의 총 경우의 수를 구하시오.
  • 단, n이 선언되지 않았을 경우 3명으로 진행한다.

입출력

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 ...
    ]
  */
let output = rockPaperScissors();

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

의사 코드

  • [rock,paper,sissors]의 요소들로 출력해줘야 되니, 먼저 가위바위보를 지정해주는 배열을 선언한다.
  • 모든 사람이 전부 가위바위보를 내었을 때 정답 배열에 넣어준다.
  • 재귀를 통해 한 사람 한 명씩 무엇을 내었는지 확인하고 반복해준다.
function rockPaperScissors (n = 3) {


  let arr = ["rock", "paper", "scissors"] //가위바위보 배열
  
  let ans = []; // 정답 출력 배열

  function dfs(count, arr, res) { //count = 사람의 수 ,res = 각각 사람마다 무엇을 내었는지 담아낼 배열
    let result = [...res] // 참조형이기 때문에 스프레드 문법을 통해 값을 직접 선언해준다.
    if (count === 0) {
      ans.push(res)
      return
    }

    for (let i = 0; i < arr.length; i++) {
      result.push(arr[i]) // 각각 사람들이 무엇을 내었는지 확인하는 배열
      dfs(count - 1, arr,result ) // count - 1을 통해 한 명씩 내었다는 것을 반환해준다.
      result = [...res] // 다른 경우의 수가 올 수 있으니 다시 초기 값으로 초기화 시켜준다.
    }
  }

  dfs(n, arr, [])
  return ans
};

0개의 댓글