- backtrakcing(int length, int depth, String s)
1. base condition을 위한 length와 탐색을 위한 depth를 파라미터로 두었으며,
문자열을 누적해서 만들어가기 위해 문자열 s를 파라미터로 두었따
- backtracking(length, depth+1, s + arr[i])
1. 전형적인 백트래킹 재귀식이다
- if(depth == length){...}
깊이와 길이가 같아질 때, set에 완성 문자열을 넣어주고 종료한다
(1회차 실패)
import java.io.*;
import java.util.*;
public class Main {
static boolean[] alpha;
static Set<String> set;
static char[] arr;
public static void main(String[] args) throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(System.out));
int n = Integer.parseInt(br.readLine());
for (int i = 0; i < n; i++) {
arr = br.readLine().toCharArray();
alpha = new boolean[arr.length];
set = new TreeSet<>();
backtracking(arr.length, 0, "");
for (String s : set) {
bw.write(s+"\n");
}
}
br.close();
bw.close();
}
private static void backtracking(int length, int depth, String s) {
if(depth == length){
set.add(s);
return;
}
for (int i = 0; i < length; i++) {
if(!alpha[i]){
alpha[i] = true;
backtracking(length, depth+1, s+arr[i]);
alpha[i] = false;
}
}
}
}
(2회차 성공!)
import java.io.*;
import java.util.*;
public class Main {
static int[] alpha;
static Set<String> set;
static char[] arr;
public static void main(String[] args) throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(System.out));
int n = Integer.parseInt(br.readLine());
for (int i = 0; i < n; i++) {
arr = br.readLine().toCharArray();
alpha = new int[26];
for (int j = 0; j < arr.length; j++) {
alpha[arr[j] - 'a']++;
}
set = new TreeSet<>();
backtracking(arr.length, 0, "");
for (String s : set) {
bw.write(s+"\n");
}
}
br.close();
bw.close();
}
private static void backtracking(int length, int depth, String s) {
if(depth == length){
set.add(s);
return;
}
for (int i = 0; i < 26; i++) {
if(alpha[i] > 0){
alpha[i]--;
backtracking(length, depth+1, s+((char)(i+'a')));
alpha[i]++;
}
}
}
}