[중복순열] 가위바위보

박재현·2022년 3월 22일
0

rockPaperScissors

문제

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

입력

n

출력

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

주의사항

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

입출력 예시

Advanced
가위바위보 게임의 수를 나타내는 양의 정수 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 ...
    ]
  */

📌 해당 문제의 경우 DFS 방식을 활용하였다.

  1. 탐색 조건으로 중복되는 인덱스에 대해 tmp 배열에 기록한다.
  2. level을 1씩 증가시키며 for문을 반복한다.
  3. level이 n이 되었을 때 탐색을 종료하고 기록된 tmp 배열을 answer에 넣는다.
function rockPaperScissors (n) {
    let answer = [];
    const caseOfPlay = ["rock", "paper", "scissors"];

    let tmp = Array.from({ length: n}, () => 0)

    const DFS = (L) => {
        if (L === n) {
            answer.push([...tmp])
        }
        else {
            for ( let i = 0; i < caseOfPlay.length; i++) {
                tmp[L] = caseOfPlay[i]
                DFS(L+1)
            }
        }
    }
    DFS(0);

    return answer;
}

아직 DFS에 익숙하지 않아 해당 문제를 푸는데 꽤 오랜 시간이 걸렸다. 더 많은 문제를 풀어보면 좋을 것 같다.

0개의 댓글