๐Ÿ“™

์ˆœ์—ด / ์กฐํ•ฉ

์ˆœ์—ด

์„œ๋กœ ๋‹ค๋ฅธ n๊ฐœ ์ค‘์— ์ˆœ์„œ๋ฅผ ๊ณ ๋ คํ•˜์—ฌ r๊ฐœ๋ฅผ ์„ ํƒํ•˜๋Š” ๊ฒฝ์šฐ์˜ ์ˆ˜
nPr=n!(nโˆ’r)!{n}P{r} = \frac{n!}{(n - r)!}
์ˆœ์—ด ๊ตฌํ˜„ํ•˜๊ธฐ
function permutation(arr, selectNum) { if (selectNum === 1) { // ์„ ํƒํ•˜๋ ค๋Š” ์š”์†Œ๊ฐ€ 1์ธ ๊ฒฝ์šฐ, ๋ฐฐ์—ด์˜ ๋ชจ๋“  ์š”์†Œ ์ฐจ๋ก€๋Œ€๋กœ ์ถœ๋ ฅ return arr.map((i) => [i]); } return arr.reduce((acc, target, _, origin) => { const rest = origin.filter((i) => target !== i); // target ์š”์†Œ๋ฅผ ์ œ์™ธํ•œ ๋‚˜๋จธ์ง€ ๋ฐฐ์—ด const p_arr = permutation(rest, selectNum - 1); // ์žฌ๊ท€๋ฅผ ์‚ฌ์šฉํ•ด rest์˜ ์ˆœ์—ด ์ฐพ๊ธฐ const add_arr = p_arr.map((i) => [target, ...i]) // rest ์ˆœ์—ด ์š”์†Œ๋“ค ์•ž์— target ์š”์†Œ ์ถ”๊ฐ€ acc.push(...add_arr); return acc; // arr ๋ฐฐ์—ด์˜ ์ˆœ์—ด ์ถœ๋ ฅ }, []); }
JavaScript
๋ณต์‚ฌ

์ค‘๋ณต ์ˆœ์—ด

function permutation(arr, selectNum) { if (selectNum === 1) { // ์„ ํƒํ•˜๋ ค๋Š” ์š”์†Œ๊ฐ€ 1์ธ ๊ฒฝ์šฐ, ๋ฐฐ์—ด์˜ ๋ชจ๋“  ์š”์†Œ ์ฐจ๋ก€๋Œ€๋กœ ์ถœ๋ ฅ return arr.map((i) => [i]); } return arr.reduce((acc, target, idx, origin) => { const p_arr = permutation(origin, selectNum - 1); // ์žฌ๊ท€๋ฅผ ์‚ฌ์šฉํ•ด rest์˜ ์ˆœ์—ด ์ฐพ๊ธฐ const add_arr = p_arr.map((i) => [target, ...i]) // rest ์ˆœ์—ด ์š”์†Œ๋“ค ์•ž์— target ์š”์†Œ ์ถ”๊ฐ€ acc.push(...add_arr); return acc; // arr ๋ฐฐ์—ด์˜ ์ˆœ์—ด ์ถœ๋ ฅ }, []); } // ๋ฐฉ๋ฒ•2 function permutation(arr, selectNum) { const result = []; if (selectNum === 1) return arr.map((v) => [v]); arr.forEach((v, idx, arr) => { const fixed = v; const restArr = arr; const permutationArr = permutation(restArr, selectNum - 1); const combineFix = permutationArr.map((v) => [fixed, ...v]); result.push(...combineFix); }); return result; }
JavaScript
๋ณต์‚ฌ

์กฐํ•ฉ

์„œ๋กœ ๋‹ค๋ฅธ n๊ฐœ ์ค‘์— ์ˆœ์„œ์— ์ƒ๊ด€ ์—†์ด r๊ฐœ๋ฅผ ์„ ํƒํ•˜๋Š” ๊ฒฝ์šฐ์˜ ์ˆ˜
nCr=n!r!(nโˆ’r)!{n}C{r} = \frac{n!}{r!(n - r)!}
const getCombinations = function (arr, selectNumber) { if (selectNumber === 1) return arr.map((value) => [value]); // 1๊ฐœ์”ฉ ํƒํ•  ๋•Œ, ๋ฐ”๋กœ ๋ชจ๋“  ๋ฐฐ์—ด์˜ ์›์†Œ return return arr.reduce((acc, fixed, index, origin) => { const rest = origin.slice(index + 1); // ํ•ด๋‹นํ•˜๋Š” fixed๋ฅผ ์ œ์™ธํ•œ ๋‚˜๋จธ์ง€ ๋’ค const combinations = getCombinations(rest, selectNumber - 1); // ๋‚˜๋จธ์ง€์— ๋Œ€ํ•ด์„œ ์กฐํ•ฉ์„ ๊ตฌํ•œ๋‹ค. const attached = combinations.map((combination) => [fixed, ...combination]); // ๋Œ์•„์˜จ ์กฐํ•ฉ์— ๋–ผ ๋†“์€(fixed) ๊ฐ’ ๋ถ™์ด๊ธฐ results.push(...attached); // ๋ฐฐ์—ด spread syntax ๋กœ ๋ชจ๋‘๋‹ค push }, []); return results; // ๊ฒฐ๊ณผ ๋‹ด๊ธด results return }
JavaScript
๋ณต์‚ฌ
์š”์†Œ๊ฐ€ 11๊ฐœ ์ด์ƒ์ด๋ฉด ์Šคํƒ์˜ค๋ฒ„ํ”Œ๋กœ์šฐ ์ผ์–ด๋‚จ
โ‡’ ์š”์†Œ๊ฐ€ ๋งŽ์€ ๊ฒฝ์šฐ์—๋Š” DP์‚ฌ์šฉ

Reference