Algorithm # [중복순열]

kdobro_dev·2022년 3월 3일
0

Algorithm

목록 보기
7/7
post-thumbnail

📝오늘 배운 내용

알고리즘 문제 중 중복순열 문제를 풀어보았다.

문제

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

이 문제는 중복순열을 사용해서 풀어야 하는 알고리즘 문제이다. 아래 코드는 레퍼런스를 참고하여 한번 더 풀어본 코드이다.

function game (rounds) {
  // 총 3개의 선택지가 있기 때문에 배열로 나열해준다.
  let games = ["rock", "paper", "scissors"];
  // 결과를 담을 배열
  let result = [];
  // rounds는 입력 받을 판 수이며, rounds에 어떠한 값이 들어오면 rounds를 rounds로 , 아니면 3을 넣어준다.
  rounds = rounds || 3;
  // 재귀 함수를 만든다.
  let permutate = (roundsLeft, bucket) => {
    // 재귀 함수 탈출 조건
    // 여기서 roundsLeft 인자로 판 수, bucket으로 빈 배열을 입력 받는다.
    // 만약, 판 수가 0이 되면, result에 bucket을 넣어주고 함수를 빠져나온다.
    if (roundsLeft === 0) { 
      result.push(bucket);
      return;
    }
    // games에 총 선택지가 있으니 games만큼 반복한다.
    for (let i = 0; i < games.length; i++) {
      // games의 요소들을 반복해서 대입한다.
      let current = games[i];
      // permutate함수를 재귀로 사용한다.
      // 인자로 roundsLeft에 -1한 값을 넣고, bucket은 current, 즉 rock이 들어온다.
      // 중복된 값도 들어올 수 있기 때문에 i가 0일 때, rounds가 0이 될때까지 반복한다.
      // rounds가 3이라고 한다면, rounds가 0이 되려면 3번 반복해야 한다.
      // 그 반복이 완료되어야 i는 1이 증가하고, 1이 된 i로 다시 current에 대입해서 이어간다.
      permutate(roundsLeft - 1, bucket.concat(current));
    }
  }

  permutate(rounds, []);
  return result;
};
profile
do your best at any moment

0개의 댓글