가위바위보

hyeongirlife·2022년 1월 19일
0

Algorithm

목록 보기
28/30
post-thumbnail

🔒 문제

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

🔒 출력

2차원 배열(arr[i])을 리턴해야 합니다.
arr[i]는 전체 경우의 수 중 한 가지 경우(총 세 번의 선택)를 의미하는 배열입니다.
arr[i]는 'rock', 'paper', 'scissors' 중 한 가지 이상을 요소로 갖는 배열입니다.
arr[i].length는 3

🔒 주의사항

최종적으로 리턴되는 배열의 순서는 가중치 적용 정렬(Weighted Sort)을 따릅니다.
중요도는 'rock', 'paper', 'scissors' 순으로 높습니다.
쉽게 생각해 올림픽 순위 결정 방식을 참고하면 됩니다.
금메달('rock')이 은메달('paper')보다 우선하고, 은메달('paper')이 동메달('scissors')보다 우선합니다.

🔒 입출력 예시

let output = rockPaperScissors();

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

💡 생각

3중 for문을 통한 순열 방법을 사용해 결과를 리턴하자.
추가적으로 재귀를 활용해 많은 횟수의 가위바위보를 하는 경우를 고려해보자.

✍ 풀이

function rockPaperScissors(rounds=3) {
  // TODO: 여기에 코드를 작성합니다.
  let result = []
  let game = ["rock", "paper", "scissors"]
//3중 for문 풀이
  // for (let i = 0; i < game.length; i++) {
  //   for (let j = 0; j < game.length; j++) {
  //     for (let k = 0; k < game.length; k++) {
  //       result.push([game[i], game[j], game[k]])
  //     }
  //   }
  // }
  // return result
function recursion(count,bucket){
  //재귀 탈출조건
  if(count === 0){
    result.push(bucket)
    return;
  }
  for(let i=0;i<game.length;i++){
    let pick = game[i]
    recursion(count-1,bucket.concat(pick))
  }
}
recursion(rounds,[])
return result
};

💡 후기

3중 for문으로도 해결할 수 있지만,
게임횟수가 수십회로 증가할 경우 for문을 쓰는 것은 매우 비효율 적이다. 재귀를 사용할 때 또 다른 재귀가 실행되기 때문에 for문이 stack에
계속 쌓인다는 것을 손으로 코드를 직접적으며 결과값을 예상해보니 파악할 수 있었다. 병합정렬 알고리즘에서도 경험했던 것인데 까먹지 않도록
계속 봐야겠다.

profile
머릿속에 있는 내용을 정리하기

0개의 댓글

관련 채용 정보