[Toy Problem] 01_rockPaperScissors

Ditto·2020년 10월 30일

가위바위보 게임을 세판 연속적으로 한다고 했을때 한 사람이 낼 수 있는 경우의 수는 얼마일까? 가위, 바위, 보라는 조합을 이용하면 3^3 = 27가지의 조합이 나오게 된다. 한판 한판을 기록한다고 생각해보면 다음과 같은 내용이 나올것이다.

첫번째 판 : 바위, 바위, 바위
두번째 판 : 바위, 바위, 가위
세번째 판 : 바위, 바위, 보
...

이 문제에서 최종적으로 리턴되는 배열의 순서는 가중치 적용 정렬을 따르며 순서는 rock, paper, scissors 순이다.
한참을 고민하다가 삼중 반복문을 만들어서 문제를 풀었으나 레퍼런스 코드는 내가 생각한 것보다 훨씬 고차원적으로 풀려 있어서 허탈했다.
여전히 배울게 많다.

let values = ['rock', 'paper', 'scissors'];

위와 같은 값으로 정해놓고 결과값을 생각해봤을때 아래와 같은 결과물을 유추해볼 수 있다.

[0, 0, 0],
[0, 0, 1],
[0, 0, 2],
[0, 1, 0],
[0, 1, 1],
[0, 1, 2],
[0, 2, 0],
[0, 2, 1],
[0, 2, 2],
[1, 0, 0],
[1, 0, 1],
[1, 0, 2],
[1, 1, 0],
[1, 1, 1],
[1, 1, 2],
[1, 2, 0],
[1, 2, 1],
[1, 2, 2],
[2, 0, 0],
[2, 0, 1],
[2, 0, 2],
[2, 1, 0],
[2, 1, 1],
[2, 1, 2],
[2, 2, 0],
[2, 2, 1],
[2, 2, 2]

각 인덱스 자리마다 반복되는 부분이 눈에 보여 아래와 같은 삼중 반복분 코드를 통해 문제를 해결했다.

const rockPaperScissors = function (input) {
  let inputValue = input || 3;
  let result = [];
  let values = ['rock', 'paper', 'scissors'];
  let count = 0;
  for(let i = 0; i < inputValue; i++){
    for(let j = 0; j < inputValue; j++){
      while(count < inputValue){
      let value = [];
      value.push(values[i]);
      value.push(values[j]);
      value.push(values[count]);
      result.push(value);
      count++;
      }
      count = 0;
    }
  }
  return result;
};

하지만 너무나 하드코딩 풀이법이었고 앞으로는 좀 더 고차원적인 풀이방법을 생각해봐야겠다.

// 레퍼런스
const rockPaperScissors = function (rounds) {
  rounds = rounds || 3;
  const rps = ['rock', 'paper', 'scissors'];
  const outcomes = [];
  let permutate = function (roundsToGo, playedSoFar) {
    if (roundsToGo === 0) {
      outcomes.push(playedSoFar);
      return;
    }
    for (let i = 0; i < rps.length; i++) {
      let currentPlay = rps[i];
      permutate(roundsToGo - 1, playedSoFar.concat(currentPlay));
    }
  };
  permutate(rounds, []);
  return outcomes;
};
profile
늘 성장하는 개발자이고 싶습니다

0개의 댓글