- backtracking(String s, int size, int depth) 
1. s에 선택한 문자를 계속 더해나가며 size와 길이가 같아질 때가 base condition이된다
2. depth가 -1보다 작거나 같으면 depth에 size-1로 갱신해주었고,
depth가 size와 같으면 depth를 0으로 갱신해주었다
 - backtracking(s + n.charAt(depth), size, depth+1) 
- backtracking(n.charAt(depth) + s, size, depth-1) 
 - if(s.length() == size) {...} 
1. 길이가 전체 문자열 n의 크기와 같아지면 종료한다
2. 만약 s가 n과 같다면 ans의 값을 증가시켜준다
(1회차 시도 실패)
import java.io.*;
import java.util.*;
public class Main {
    static int ans = 0;
    static String n;
    static boolean[] visited;
    public static void main(String[] args) throws IOException {
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(System.out));
        n = br.readLine();
        int size = n.length();
        visited = new boolean[size];
        for (int i = 0; i < size; i++) {
            backtracking("", size, i);
        }
        bw.write(ans+"");
        br.close();
        bw.close();
    }
    private static void backtracking(String s, int size, int depth) {
        if(s.length() == size){
            if(s.equals(n)){
                ans++;
            }
            return;
        }
        if(depth <= -1){
            depth = size-1;
        }
        if(depth == size){
            depth = 0;
        }
        if(!visited[depth]){
            visited[depth] = true;
            backtracking(s + n.charAt(depth), size, depth + 1);
            backtracking(n.charAt(depth) + s, size, depth - 1);
            visited[depth] = false;
        }
    }
}
(2회차 시도 성공)
import java.io.*;
import java.util.*;
public class Main {
    static char[] arr;
    static Set<String> set;
    public static void main(String[] args) throws IOException {
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(System.out));
        arr = br.readLine().toCharArray();
        set = new HashSet<>();
        for (int i = 0; i < arr.length; i++) {
            dfs(i, i, "" + arr[i], "" + arr[i]);
        }
        bw.write(set.size()+"");
        br.close();
        bw.close();
    }
    private static void dfs(int left, int right, String s, String path) {
        if(left == 0 && right == arr.length-1){
            set.add(path);
            return;
        }
        if(left - 1 >= 0){
            dfs(left-1, right, arr[left-1] + s, path + " " + arr[left] + s);
        }
        if(right + 1 < arr.length){
            dfs(left, right+1, s + arr[right+1], path + " " + s + arr[right]);
        }
    }
}