- 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]);
}
}
}