새벽에 적느라 풀이 설명이 엉망이었어서 수정하였다
class Solution {
/*
n개의 정수가 주어졌을 때 .
길이 n을 가진 문자열의 개수를 리턴한다.
이 때 이 문자열은 : 모음 a,e,i,o,u로 만 이루어져있어야 하며, lexicographically 정렬되어있어야 한다.
lexicographically정렬되어있다는게 무슨 말이냐면
문자열의 각 character에 대한 index i 일 때, 모든 i에 대하여
s[i]가 알파벳상으로 s[i+1]보다 이전 또는 같은 알파벳인것을 말한다.
======
생각해보면
======
n이 1이상 50 이하다.
======
1. 단순하게 생각한다면
- 각 자리에 a,e,i,o,u의 5가지 알파벳이 올 수 있다
- i에 e가 온다면 i+1부터는 4가지 알파벳이 올 수 있다.
- i에 i가 온다면, i+1부터는 3가지 알파벳이 올 수 있다.
- i에 o가 온다면, i+1부터는 2가지 알파벳이 올 수 있다.
=====
2.
*/
public int gn;
public int countVowelStrings(int n) {
gn=n;
return solve(0,0);
}
public int solve(int i,int an){
if(an==gn)return 1;
int sum=0;
for(int cur=i;cur<5;cur++){
sum+=solve(cur,an+1);
}
return sum;
}
}
a,e,i,o,u로 시작 하는 것의 개수를 저장하는 cache가 존재한다고 하자.
예시
n=1일 때
a e i o u → 1,1,1,1,1
n=2일 때
aa ae ai ao au →5,4,3,2,1
ee ei eo eu
ii io iu
oo ou
uu
n=3일 때 a로 시작하는 것만 먼저 해 보면
aaa aae aai aao aau
aee aei aeo aeu
aii aio aiu
aoo aou
auu
이다
eee eei eeo eeu
......
즉,
n=1 -> 1 1 1 1 1
n=2 -> 5 4 3 2 1
n=3 -> 15 10 6 3 1
n=1 일 때부터 n의 값을 증가시키면서,
x로 시작하는 string의 개수를 세어 놓는다면
n이 증가했을 때, x로 시작하는것의 개수를 구하기 위해서는, 이전의 n일 때 , x보다 lexicographically하게 뒤에 있는 또는 같은 알파벳으로 시작하는 것의 개수들을 모두 더한 것이 된다.
class Solution {
public int countVowelStrings(int n) {
int[] alp = new int[]{1,1,1,1,1};
if(n==1)return 5;
int cur=2;
int sum=0;
int i=0,pre=0;
while(cur<=n){
// cur이 2라는 것은, 현재 n이 2인 상황에 대한 것
// alp[i]자체가, n= cur-1일 때에, x로 시작하는 string의 개수 이니 pre는 i+1로시작
for(i=0;i<alp.length;i++){
for(pre=i+1;pre<alp.length;pre++) alp[i]+=alp[pre];
}
cur++;
}
for(i=0;i<alp.length;i++)
sum+=alp[i];
return sum;
}
}