-
Notifications
You must be signed in to change notification settings - Fork 1
/
Copy pathjavascript_permutations.js
36 lines (33 loc) ยท 1.26 KB
/
javascript_permutations.js
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
27
28
29
30
31
32
33
34
35
36
/*
i ๊ฐ 0์ผ ๋:
i ๊ฐ 0์ด๋ฉด ๋ฐฐ์ด์ ์ฒซ ์์์ด๊ธฐ ๋๋ฌธ์ ๋ฐ๋ก ์ฐ๋ฉด ๋๋ค.
arr[i-1] != arr[i] ์ผ ๋:
์ง๊ธ์ arr ์ด ์ ๋ ฌ๋์ด ์๋ค. ์ด๋ i ๋ฒ์งธ ์์๊ฐ i-1 ๋ฒ์งธ์ ๋ค๋ฅด๋ฉด ๊ทธ๋ฅ โBโ, โCโ ์ฒ๋ผ ์๋ก ๋ค๋ฅธ ์์์ด๊ธฐ ๋๋ฌธ์ ๋ฐ๋ก ์ด๋ค.
used[i-1] ์ผ ๋:
๊ฐ๋ น i ๋ฒ์งธ ์์๊ฐ ๋ ๋ฒ์งธ โAโ์ด๋ฉด, ์ค๋ณต์ ํผํ๊ธฐ ์ํด ์ฒซ ๋ฒ์งธ โAโ๊ฐ ์ฌ์ฉ๋ ์ํ์ฌ์ผ๋ง ์ธ ์ ์๋ค. ๊ทธ๋์ i-1 ๋ฒ์งธ ์์๊ฐ ์ฐ์ธ ์ํ์ธ์ง ํ์ธํ๋ค.
์ด๋ ๊ฒ ํ๋ฉด ์์ด์ผ ๋ ์ค๋ณต์ ํผํ ์ ์๋ค.
// ์
๋ ฅ๊ฐ arr์ ์ ๋ ฌ๋ ๋ฌธ์์ด์ด๋ค !
*/
const permutations = (arr, r) => {
arr = [...arr].sort(); // sorted
used = [];
for (let i = 0; i < arr.length; i++) used.push(0);
const generate = (chosen, used) => {
if (chosen.length == r) {
console.log(chosen);
return;
}
for (let i = 0; i < arr.length; i++) {
if (!used[i] && (i == 0 || arr[i - 1] != arr[i] || used[i - 1])) {
chosen.push(arr[i]);
used[i] = 1;
generate(chosen, used);
used[i] = 0;
chosen.pop();
}
}
};
generate([], used);
};
permutations('AABC', 2); // ์ ๋ ฌ๋ ๋ฌธ์์ด!
permutations([1, 2, 3, 4, 5], 3); // ์ ๋ ฌ๋ ๋ฐฐ์ด