- μ‘°ν©μ μμ±νλ κ·μΉμΌλ‘ λΆν° κ²½μ°μ μλ₯Ό ꡬνλ λ¬Έμ .
- 첫λ²μ§ΈλΆν° μμνμ¬ νΉμ indexμ
a, e, i, o, u κ° κΈμκ° μ¬ μ μλ κ²½μ°μ μλ₯Ό κ³μ°ν΄λκ°λ©΄ λλ€. - μ΄λ₯Ό μν΄μ κ²½μ°μ μλ₯Ό μΈλ array
curr, nextλ₯Ό λ§λ λ€. - μ΄μ κ²½μ°μ μμ λ€μ κ²½μ°μ μλ₯Ό κ³μ°ν΄ λκ°λ©΄μ swapμ μνν΄λκ°λ€.
- λ¨Όμ 첫λ²μ§Έ κΈμλ λͺ¨λ κΈμκ° κ³ λ₯΄κ² μ¬ μ μλ€. λ°λΌμ 맨 첫κΈμμ κ²½μ°μ μλ κ°κ° 1κ°μ© μΈ κ²μ΄ λλ€.
vector<long long> curr(5, 1);
- λ€μ index λΆν°λ μ΄μ μ μ¨ κΈμμ λ°λΌμ κ²½μ°μ μκ° μ ν΄μ§λ€.
- νμ¬ indexμ κΈμκ°
a μ΄λ €λ©΄ μ΄μ κΈμκ° e μ¬μΌ νλ€. - λ°λΌμ νμ¬ indexμ κΈμκ°
a μΈ κ²½μ°μ μ = μ΄μ κΈμκ° e μΈ κ²½μ°μ μκ° λλ€.
- νμ¬ indexμ κΈμκ°
e μ΄λ €λ©΄ μ΄μ κΈμκ° a λλ i μ¬μΌ νλ€. - λ°λΌμ νμ¬ indexμ κΈμκ°
e μΈ κ²½μ°μ μ = μ΄μ κΈμκ° a λλ i μΈ κ²½μ°μ μμ ν©μ΄ λλ€.
- νμ¬ indexμ κΈμκ°
i μ΄λ €λ©΄ μ΄μ κΈμκ° i κ° μλ λͺ¨λ κΈμ (a, e, o, u) μ€ νλμ¬μΌ νλ€. - λ°λΌμ νμ¬ indexμ κΈμκ°
i μΈ κ²½μ°μ μ = μ΄μ κΈμκ° a, e, o, u μΈ κ²½μ°μ μμ ν©μ΄ λλ€.
- νμ¬ indexμ κΈμκ°
o μ΄λ €λ©΄ μ΄μ κΈμκ° i λλ u μ¬μΌ νλ€. - λ°λΌμ νμ¬ indexμ κΈμκ°
o μΈ κ²½μ°μ μ = μ΄μ κΈμκ° i λλ u μΈ κ²½μ°μ μμ ν©μ΄ λλ€.
- νμ¬ indexμ κΈμκ°
u μ΄λ €λ©΄ μ΄μ κΈμκ° a μ¬μΌ νλ€. - λ°λΌμ νμ¬ indexμ κΈμκ°
u μΈ κ²½μ°μ μ = μ΄μ κΈμκ° a μΈ κ²½μ°μ μκ° λλ€.
- μ΄λ κ² λ§μ§λ§ indexκΉμ§ κ³μ°μ λ§μΉλ©΄ array
curr μλ λ§μ§λ§ indexμ κΈμκ° κ°κ° a, e, i, o, u μΈ κ²½μ°μ μκ° λ€μ΄μλ€. μ΄ κ°μ λͺ¨λ λνλ©΄ μνλ κ²°κ³Όλ₯Ό μ»μ μ μλ€.
// a <- e
// e <- ai
// i <- aeou
// o <- iu
// u <- a
class Solution {
public:
static constexpr int MOD = 1e9 + 7;
int countVowelPermutation(int n) {
vector<long long> curr(5, 1);
vector<long long> next(5, 0);
while (--n > 0) {
next[0] = curr[1];
next[1] = (curr[0] + curr[2]) % MOD;
next[2] = (curr[0] + curr[1] + curr[3] + curr[4]) % MOD;
next[3] = (curr[2] + curr[4]) % MOD;
next[4] = curr[0];
curr.swap(next);
}
long long result = 0;
for (auto v : curr) {
result = (result + v) % MOD;
}
return result;
}
};