μλ νμΈμ :) μ€λμ μμ΄μ μ¬μ©νλ BF μκ³ λ¦¬μ¦μ λν΄ μμλ³΄κ² μ΅λλ€. μ€μλ λ°©λ², νΉμ μμ μμμ λͺ¨λ κ²½μ°μ μ λ±, μμκ° μ€μν μμ μ μμ΄ BF + μμ΄μ μ¬μ©ν©λλ€. κ·ΈλΌ μ€λλ νμ΄ν μ λλ€πΏ
A[0] ~ A[N-1] μμ, A[i-1] > A[i] μ λ§μ‘±νμ§ μλ μ§μ μ°ΎκΈ° -> μ‘°κ±΄μ΄ λ§μ‘±νμ§ μλ μ§μ A[i-1]
π μ΅λ N λ² μ€νλλ―λ‘, O(N)
A[i] ~ A[N-1] μμ, κ°μ₯ κΈ΄ κ°μνλ μμ΄ μ°ΎκΈ° -> A[i] ~ A[i+?] == B[0] ~ B[?+1]
π μ΅λ N λ² μ€νλλ―λ‘, O(N)
A[i] ~ A[N-1] μ¬μ΄μμ, A[i-1] λ³΄λ€ κ°μ΄ ν¬λ©°, κ°μ₯ μμ μ μ°ΎκΈ° -> A[j]
A[i-1] κ³Ό A[j]λ₯Ό swap !
π μ΅λ νλ² μ€νλλ―λ‘, O(1)
A[i-1] ~ A[N-1] λ₯Ό μ€λ¦μ°¨μ μ λ ¬
π O(N)
λ°λΌμ, O(3N + 1) μ΄λ―λ‘, νΉμ μμ΄μ λ€μ μμ΄μ μ°Ύλ μκ³ λ¦¬μ¦μ O(N)μ μκ° λ³΅μ‘λλ₯Ό κ°μ§κ² λ©λλ€.
(C++ STL next_permutation, prev_permutation)
bool next_permutation(vector<int> &a, int n) {
int i = n-1;
while (i > 0 && a[i-1] >= a[i]) {
i -= 1;
}
if (i <= 0) {
return false; // λ§μ§λ§ μμ΄μ΄λ©΄ false
}
int j = n-1;
while (a[j] <= a[i-1]) {
j -= 1;
}
swap(a[i-1], a[j]);
j = n-1;
while (i < j) {
swap(a[i], a[j]);
i += 1;
j -= 1;
}
return true; // λ€μ μμ΄μ΄ μλ€λ©΄ true
}
λ€μ μμ΄ μ°ΎκΈ° μκ³ λ¦¬μ¦κ³Ό 쑰건(λΆλ±νΈμ λ°©ν₯)λ§ λ€λ₯΄λ―λ‘, O(N)μ μκ° λ³΅μ‘λλ₯Ό κ°μ§κ² λ©λλ€.