rockPaperScissors
문제
가위바위보 게임은 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 ... ] */
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 ... ] */
나의 풀이
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
|
const rockPaperScissors = function (n) {
// 가위 바위 보에 해당하는 객체 생성
// 모든 경우의 수를 만드는 함수 생성
///1. while
let count = 1;
let arr = [["rock"], ["paper"], ["scissors"]];
//func
const makeNthArr = (arr) => {
while (count < n) {
let willBeAdded = arr.filter(el => el.length === count)
willBeAdded.forEach((el) => {
for (let i = 0; i < 3; i++) {
let tmp = [...el];
tmp.push(arr[i][0]);
arr.push(tmp);
}
})
count++;
}
}
//exe
makeNthArr(arr);
let result = arr.filter(el => el.length === n)
return [result];
};
|
cs |
Reference
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
|
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;
};
|
cs |
배운점
1. 순열 permutate는 같은 논리가 반복되는 구조이므로 recursion을 쓰는게 코드작성에 유리하다.
2. 배열의 복사를 위해서 let newArr = [...arr]을 사용할 수도 있다.
let a = [1, 2, 3]
b = a
a === b ? true
b = [...a]
a === b ? false
3. push를 한번에 2개 하면 제대로 반영되지 않는다.
'Computer Science > Algorithm' 카테고리의 다른 글
Prm 6 : Sudoku / parseInt, [...Array().keys()].slice() (0) | 2021.01.01 |
---|---|
BubbleSort (0) | 2020.12.29 |
Prm 3 : Subset (0) | 2020.12.28 |
Prm 2 : fibonacci (0) | 2020.12.27 |
[프로그래머스] [Lv. 1](matrix)카카오 크레인 인형뽑기 게임 (0) | 2020.12.22 |