데이터 구조에서 벗어나 한숨 돌리나 싶었더니, 이번엔 더욱 어려운 문제가 기다리고 있었다. 아침 첫 시간 toyproblem 코플릿 문제를 풀었는데 문제의 내용은 N명의 사람이 가위, 바위, 보를 할 때 나올수 있는 모든 경우의 수를 배열로 나타내는 문제였다. 뭔가 쉬울 것 같은데? 라고 생각하고 시작을 했는데 30분 지나자 멀미가 나기 시작했고, 도저히 내가 풀 수 없는 문제라고 판단하여 레퍼런스를 참고했다.
일단 내가 고민하고 고민한 끝에 만들어낸 끔직한 코드를 먼저 보여주겠다.
let cases = ['rock', 'paper', 'scissors'];
let result = [];
for (let i = 0; i < cases.length; i += 1) {
for (let j = 0; j < cases.length; j += 1) {
for (let k = 0; k < cases.length; k += 1) {
let playing = [cases[i], cases[j], cases[k]];
result.push(playing);
}
}
}
return result;
console.log('rPS() : ', rPS());
결과는 잘(?) 나왔다. 그렇다 세명일 때만 잘 나온 것이다. 네명 다섯명 뭐 까짓것 다중 for 반복문 하면되지.... ! 자괴감이 들었다. 이 문제를 해결하려고 재귀를 배운 것인데... 재귀가 아직 익숙하지 않아서 그런가 전혀 감이 안왔다. 재귀를 사용하기전 먼저 어떻게 결과를 도출할까를 생각해야 하는데 쉽게 되지 않았다. 그래서 결국 레퍼런스를 참고했고 느낀 것은 내가 이걸 보기전 까진 죽어도 못 풀었겠다 싶었다.
const rPS = function(n) {
n = n || 3;
const cases = ['rock', 'paper', 'scissors'];
const result = [];
let makeACases = function (count, gatherCase) {
if (count === 0) {
result.push(gatherCase);
return;
}
for (let i = 0; i < cases.length; i += 1) {
let playerCase = cases[i];
makeACases(count - 1, gatherCase.concat(playerCase));
}
}
makeACases(n, []);
return result;
}
직접 함수를 만들어 재귀로 구현했다. 함수안의 함수를 이용할 생각을 왜 진작 하지 못했을까? 아직 자바스크립트를 유연하기 다루기엔 한참 부족한 느낌. if를 탈출하는 용도로 아무것도 없이 return하는 것도 오늘 처음 알았다. 잘하고 싶은데 아직은 좀 어렵다. 많이 노력하자!