1220. Count Vowels Permutation

  • 쑰합을 μƒμ„±ν•˜λŠ” κ·œμΉ™μœΌλ‘œ λΆ€ν„° 경우의 수λ₯Ό κ΅¬ν•˜λŠ” 문제.
  • μ²«λ²ˆμ§ΈλΆ€ν„° μ‹œμž‘ν•˜μ—¬ νŠΉμ • 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; } };