- μ‘°ν©μ μμ±νλ κ·μΉμΌλ‘ λΆν° κ²½μ°μ μλ₯Ό ꡬνλ λ¬Έμ .
- 첫λ²μ§ΈλΆν° μμνμ¬ νΉμ 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;
}
};