서로 다른 n개의 원소에서 r개를 중복없이 골라 순서에 상관있게 나열하는 것을 n개에서 r개를 택하는 순열이라고 하고, 여기서 중복을 허용하면 그것을 중복 수열이라고 합니다.
재귀함수를 이용해서 다음과 같이 나타낼 수 있습니다.
스택플로 출처 바로가기
중복 순열 (Permutation of Repetition)
중복순열의 구현이 약간 더 쉽습니다.
const cases = ["A", "B", "C"]
const permuteRepl = (array, n, eachElements, outArr) => { // 재귀 종료문 if (array.length == n) { outArr.push(JSON.parse(JSON.stringify(array))) // 깊은 복사 return } for (let el of eachElements) { array.push(el) permuteRepl(array, n, eachElements, outArr) array.pop() } } permuteRepl([], cases.length, cases, outArr) console.log(outArr.map(_ => _.join("")))
원리는 저도 모르고 인터넷에서 보니까 이렇게 하면 된다고 하길래 가져다 썼습니다. n**r
만큼 경우의 수가 나오므로 여기서는 3**3=27
가지 경우가 나오고 재귀함수를 사용하므로 경우가 너무 크면 에러가 발생할 수도 있습니다.
순열 (Permutation)
순열(중복 허용안함)은 약간 복잡합니다.
참고로 splice()
메서드는 배열의 기존 요소를 삭제 또는 교체하거나 새 요소를 추가하여 배열의 내용을 변경합니다. (MDN 링크)
const outArr2 = [] const permute = (array, eachElements, outArr) => { let chr for(let i = 0; i < eachElements.length; i++) { chr = eachElements.splice(i, 1)[0] // i위치에서 1만큼 제거한 배열의 0번 요소 array.push(chr) if(eachElements.length == 0) { outArr.push(array.slice()) } permute(array, eachElements, outArr) eachElements.splice(i, 0, chr) // i 위치에서 0만큼 제거(=아무것도 안함)한 뒤 chr을 i 위치에 삽입 array.pop() } return } permute([], cases, outArr2) console.log(outArr2.map(_ => _.join("")))
순열 공식에 의하면 n = 3
, r =3
이므로 6
이 나옵니다.
0개의 댓글