N번째 문자를 찾을 수 있는 depth를 구한 후 재귀를 통해 정답을 찾았다.
이전 depth의 부분에 N번째 위치가 포함된다면, 재귀를 통하여 depth를 낮추면서 t가 0이 될 때 정답을 구할 수 있다. 그 외에는 현재 depth인 t에 따라 정답을 구할 수 있다.
import java.io.*;
import java.util.*;
public class Main {
static List<Integer> list;
static char answer;
static boolean flag;
public static void main(String[] args) throws IOException{
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
int N = Integer.parseInt(br.readLine());
list = new ArrayList<>();
String moo = "moo";
list.add(3);
// 최대 depth를 구함
int t = 0;
for(int i = 1; i <= N; i++){
int n = list.get(i - 1) * 2 + i + 3;
list.add(n);
if(n >= N){
t = i;
break;
}
}
flag = false;
moo(t, N);
System.out.println(answer);
}
public static void moo(int t, int N){
if(flag) return;
if(t == 0){
answer = getChar("moo", N - 1);
flag = true;
return;
}
int mid = t + 3;
int prevLen = list.get(t - 1);
if(prevLen >= N){
moo(t - 1, N);
}
else if(prevLen + mid >= N){
String str = "moo";
for(int i = 0; i < t; i++){
str += "o";
}
answer = getChar(str, N - prevLen - 1);
flag = true;
}
else{
moo(t - 1, N - prevLen - mid);
}
}
public static char getChar(String str, int n){
return str.charAt(n);
}
}