코딩 성장기

[중복순열] 가위바위보 모든 경우 출력하기 본문

알고리즘 공부/Algorithm in JS

[중복순열] 가위바위보 모든 경우 출력하기

김소우 2022. 4. 6. 18:39

한 사람이 3번의 기회에서 만들 수 있는 모든 가위바위보 조합을 출력한다.

가위/바위/보는 중복해서 낼 수 있으며, 바위(rock) > 보(paper) >  가위(scissors) 의 가중치를 갖는다.

 

내 코드(오답)

function rockPaperScissors () {
  let resultSet = [];
  let row = ['rock', 'rock', 'rock'];
  let el = row.slice()
  // 배열에 rock paper scissors 넣어두고, 요소를 꺼내서 사용하기
  const SET = ['rock', 'paper', 'scissors'];
  // 조합을 만든다
  // row에 하나씩 추가한다.
  // 3개가 입력되면 row 를 resultSet에 넣는다.
  
  // 첫번째 요소 바꾸기
  for(let i = 0; i < 3; i++){
    el[0] = SET[i];
    // 두번째 요소 바꾸기
    for(let j = 0; j < 3; j++){
      el[1] = SET[j];
      // 세번째 요소 바꾸기
      for(let k = 0; k < 3; k++){
        el[2] = SET[k];
        resultSet.push(el);  
      } el = row.slice()
    }
  } return resultSet;
};

얼핏보면 코드가 틀린 것 같지 않지만 결과를 개발자 도구를 이용해 확인하면 잘못된 값이 나온다.

요소를 변경했음에도 같은 조합들이 중복되어 출력된다!

  for(let k = 0; k < 3; k++){
        el[2] = SET[k];
        resultSet.push(el); 
      } el = row.slice()

세번째 반복문에서 오류가 있었는데, resultSet에 들어간 배열 el이 모두 같은 주소값을 가지고 있으므로

el[2]에 새로운 값을 할당할때 마다, resultSet에 추가되어 있는 el[2] 값도 함께 변하기 때문에

중복되는 케이스들이 출력되는 문제가 발생했다.

따라서 새로운 값을 갖는 '새로운 배열'을 만들어서 resultSet에 추가시켜주어야 한다.

splice(), slice()메소드 모두.. 반복문에서는 동작기제를 파악하기 힘드므로, 사용을 지양한다.

 

내 코드(정답)

function rockPaperScissors () {
  let resultSet = [];
  // 배열에 rock paper scissors 넣어두고, 요소를 꺼내서 사용하기
  const SET = ['rock', 'paper', 'scissors'];
  
  // 첫번째 요소 바꾸기
  for(let i = 0; i < 3; i++){
    // 두번째 요소 바꾸기
    for(let j = 0; j < 3; j++){
      // 세번째 요소 바꾸기
      for(let k = 0; k < 3; k++){
        resultSet.push([SET[i], SET[j], SET[k]]) // 매번 새로운 배열을 생성해서 넣어줌
      }
    }
  }  return resultSet;
}