Solution
Memo
- ์์ด ๊ตฌํ ๋ฌธ์
- cpp ํ์ด๋ next_permutation์ ์ด์ฉํด์ ๊ฐ๋จํ๊ฒ ํ๋ค.
int main() {
ios_base::sync_with_stdio(false);
cin.tie(nullptr);
// ๋ฌธ์ ํด๊ฒฐ ์ฝ๋ ์์ฑ
int n;
cin >> n;
vector<int> arr;
for (int i = 1; i < n + 1; i++) {
arr.push_back(i);
}
do {
for (int i: arr) {
cout << i << ' ';
}
cout << '\n';
} while (next_permutation(arr.begin(), arr.end()));
return 0;
}
- ๋ฌธ์ ๋ ์ฝํ๋ฆฐ ๊ตฌํํ๋ค๊ฐ ๋ฐ์ํ๋๋ฐ, ์ฒ์์๋ ์๋์ฒ๋ผ ๊ตฌํํ๋ค.
fun permute(list: MutableList<Int>, start: Int, end: Int) {
// ๊ธฐ์ ์กฐ๊ฑด: ๋ชจ๋ ์์น๊ฐ ๊ฒฐ์ ๋์์ ๋
// ํ์ฌ ์์ด์ ์ถ๋ ฅํ๊ณ ์ข
๋ฃ
if (start == end) {
println(list.joinToString(" "))
return
}
// ํ์ฌ ์์น(start)์ ๊ฐ๋ฅํ ๋ชจ๋ ์์ ๋ฐฐ์นํด๋ณด๊ธฐ
for (i in start..end) {
// start ์์น์ i ์์น์ ์์ ๊ตํ
// ์: list=[1,2,4,3], start=0, i=0 โ ๊ตํ ํ [1,2,4,3] (๋ณํ ์์)
list[start] = list[i].also { list[i] = list[start] }
// ๋ค์ ์์น(start+1)๋ถํฐ ์ฌ๊ท์ ์ผ๋ก ์์ด ์์ฑ
// ์: permute([1,2,4,3], 1, 3) ํธ์ถ
permute(list, start + 1, end)
// ๋ฐฑํธ๋ํน: ์๋ ์ํ๋ก ๋ณต์
// ์: ๋ค์ list=[1,2,4,3]๋ก ๋ณต์
list[start] = list[i].also { list[i] = list[start] }
}
- ์๊ฑฐ ํ๋ ค์ ์ฐพ์๋ดค๋๋ฐ, ์ฌ์ ์ ์ ๋ ฌ์ด ํ์ํ๋ค. (์ ๋ฐฉ์์ ์์๋ฅผ ๋ณด์ฅํ์ง ์์)
์์๋
-
๊ตํ: [1,2,4,3] (1๊ณผ 1 ๊ตํ, ๋ณํ ์์)
-
์ฌ๊ท ํธ์ถ:ย
permute([1,2,4,3], 1, 3)- start=1, i=1
- ๊ตํ: [1,2,4,3] (2์ 2 ๊ตํ, ๋ณํ ์์)
- ์ฌ๊ท ํธ์ถ:ย
permute([1,2,4,3], 2, 3)- start=2, i=2
- ๊ตํ: [1,2,4,3] (4์ 4 ๊ตํ, ๋ณํ ์์)
- ์ฌ๊ท ํธ์ถ:ย
permute([1,2,4,3], 3, 3)- start=3, i=3: ์ถ๋ ฅ “1 2 4 3”
- ๋ณต์: [1,2,4,3]
- start=2, i=3
- ๊ตํ: [1,2,3,4] (4์ 3 ๊ตํ)
- ์ฌ๊ท ํธ์ถ:ย
permute([1,2,3,4], 3, 3)- start=3, i=3: ์ถ๋ ฅ “1 2 3 4”
- ๋ณต์: [1,2,4,3]
- start=2, i=2
- ๋ณต์: [1,2,4,3]
- start=1, i=2
- ๊ตํ: [1,4,2,3] (2์ 4 ๊ตํ)
- ์ฌ๊ท ํธ์ถ:ย
permute([1,4,2,3], 2, 3)- start=2, i=2
- ๊ตํ: [1,4,2,3] (2์ 2 ๊ตํ, ๋ณํ ์์)
- ์ฌ๊ท ํธ์ถ:ย
permute([1,4,2,3], 3, 3)- start=3, i=3: ์ถ๋ ฅ “1 4 2 3”
- ๋ณต์: [1,4,2,3]
- start=2, i=3
- ๊ตํ: [1,4,3,2] (2์ 3 ๊ตํ)
- ์ฌ๊ท ํธ์ถ:ย
permute([1,4,3,2], 3, 3)- start=3, i=3: ์ถ๋ ฅ “1 4 3 2”
- ๋ณต์: [1,4,2,3]
- start=2, i=2
- ๋ณต์: [1,2,4,3]
- start=1, i=3
- ๊ตํ: [1,3,4,2] (2์ 3 ๊ตํ)
- ์ฌ๊ท ํธ์ถ:ย
permute([1,3,4,2], 2, 3)- (์ดํ ์ ์ฌํ ๊ณผ์ ๋ฐ๋ณต…)
- start=1, i=1
-
๋ฐ๋ฉด cpp next_permutation์ ์์๋ฅผ ๋ณด์ฅํ๋ค. (์ฐธ๊ณ ๋ก ์ ๋ ฌ๋์ด ์๋ ์ํ๋ก next_permutation์ ํธ์ถํด์ผ ๋ชจ๋ ์์ด์ ๋ฐํ๋ฐ์ ์ ์์ผ๋ฉฐ, ์์ฌ์์ผ๋ฉด ๊ฑฐ๊ธฐ์๋ถํฐ ๋ค์ ์ฌ์ ์์์ ์์ด์ ๋ด๋ณด๋ธ๋ค)
-
์๋์ ๊ฐ์ด ๊ตฌํ (์ฌ์ค ์ฐธ๊ณ ๋ฅผ ์ข ํ๋ค)
fun getNextPermutation(arr: IntArray): Boolean {
// 1๋จ๊ณ: ๋ค์์๋ถํฐ ํ์ํ์ฌ ์ค๋ฆ์ฐจ์์ด ๊นจ์ง๋ ์์น ์ฐพ๊ธฐ
var i = arr.size - 1
// ์์: arr = [1,2,4,3]
// i=3์ผ ๋, arr[2]=4, arr[3]=3์ด๋ฏ๋ก arr[2] > arr[3], i--
// i=2์ผ ๋, arr[1]=2, arr[2]=4์ด๋ฏ๋ก arr[1] < arr[2], ๋ฐ๋ณต ์ข
๋ฃ
// ์ต์ข
i=2
while (i > 0 && arr[i - 1] >= arr[i]) i--
// ๋ด๋ฆผ์ฐจ์์ผ๋ก ์์ ํ ์ ๋ ฌ๋ ์ํ๋ฉด ๋ง์ง๋ง ์์ด
// ์์: arr = [3,2,1]์ด๋ฉด i=0์ด ๋์ด false ๋ฐํ
if (i <= 0) return false
// 2๋จ๊ณ: arr[i-1]๋ณด๋ค ํฐ ๊ฐ ์ค ๊ฐ์ฅ ์ค๋ฅธ์ชฝ์ ์๋ ๊ฐ ์ฐพ๊ธฐ
var j = arr.size - 1
// ์์: arr = [1,2,4,3], i=2, i-1=1, arr[i-1]=2
// j=3์ผ ๋, arr[3]=3 > arr[1]=2, ๋ฐ๋ณต ์ข
๋ฃ
// ์ต์ข
j=3
while (arr[j] <= arr[i - 1]) j--
// 3๋จ๊ณ: arr[i-1]๊ณผ arr[j] ๊ตํ
// ์์: arr = [1,2,4,3], i-1=1, j=3
// arr[1]=2์ arr[3]=3 ๊ตํ
// ๊ฒฐ๊ณผ: arr = [1,3,4,2]
arr[i - 1] = arr[j].also { arr[j] = arr[i - 1] }
// 4๋จ๊ณ: i๋ถํฐ ๋๊น์ง ๋ค์ง๊ธฐ (์ค๋ฆ์ฐจ์์ผ๋ก ์ ๋ ฌ)
// ์์: arr = [1,3,4,2], i=2
// i=2๋ถํฐ ๋๊น์ง [4,2]๋ฅผ ๋ค์ง์ด [2,4]๋ก ๋ง๋ฆ
// ๊ฒฐ๊ณผ: arr = [1,3,2,4]
j = arr.size - 1
while (i < j) {
arr[i] = arr[j].also { arr[j] = arr[i] }
i++
j--
}
return true
}
- ๋ค์์๋ถํฐ ์ค๋ฆ์ฐจ์์ผ๋ก 0๋ฒ ์์๊น์ง ์์ง๋ฉด ๋ง์ง๋ง์์ด
- ๋ฐ๋๋ก ๋ค์์๋ถํฐ ์ค๋ฆ์ฐจ์ ์ฒดํฌ๊ฐ ๊นจ์ง๋ฉด ๋ค์์์ด์ด ์๋๊ฒ(๋ ํฐ ์์ด)
- 2๋ฒ์ ํด๋นํ๋ ์์๋ฅผ ์ฐพ๊ณ (i) ๊ทธ ์์ ์ฌ ์ซ์(i -1)์ ์ฐพ๋๋ค.
- ํด๋น ์ซ์ ์ญ์ ๋ค์์๋ถํฐ ์ฐพ์ผ๋ฉฐ (j) ์ฐพ์ผ๋ฉด (i -1)๊ณผ ์ค์
- i ์ดํ์ ์ซ์๋ฅผ ์ค๋ฆ์ฐจ์์ผ๋ก ์ ๋ ฌํ๋ค. (๋ ํฐ ์ซ์ ์ค ๊ฐ์ฅ ์๋๋ก)