- sol1(메모리 초과): 재귀
문자열의 상상 이상으로 길어져서 메모리 초과가 발생할 것을 예상했다.
#include <bits/stdc++.h>
using namespace std;
int N;
void recursion(string str, int k, int preSize){
if(str.size() >= preSize){
cout << str[preSize-1];
return;
}
else{
string tmp = "";
for(int i = 0; i < k+2; ++i) tmp += "o";
recursion("m" + tmp + str, k+1, preSize - str.size());
}
return;
}
int main(){
cin >> N;
recursion("moo", 1, N);
return 0;
}
- 문자열 점화식
S[0]="moo"
S[k]=S[k−1]+"m"+"o"∗(k+2)+S[k−1]
- 문자열 길이 점화식: len(S[k])=2∗len(S[k−1])+k+3
S[k−1]/moo영역/S[k−1] 영역을 재귀로 분리해 실행
#include <bits/stdc++.h>
using namespace std;
int N;
string moo = "moo";
void sol(int n, int k, int len){
int new_len = 2 * len + k + 3;
if(n <= 3){
cout << moo[n-1];
return;
}
if(new_len < n){
sol(n, k+1, new_len);
}
else{
if(n > len && n <= len + k + 3){
if(n == len + 1) cout << "m";
else cout << "o";
return;
}
else{
sol(n-(len+k+3), 1, 3);
}
}
}
int main(){
cin >> N;
sol(N, 1, 3);
return 0;
}