Problem Solving/Baekjoon
[백준] 25328 문자열 집합 조합하기 - Backtracking / Java
graycode
2023. 3. 1. 16:09
• 문제 링크
25328번: 문자열 집합 조합하기
알파벳 소문자로 구성된 문자열 X, Y, Z가 주어진다. 각각의 문자열에는 중복된 문자가 존재하지 않는다. 문자열 S에 있는 문자 중 임의로 k개를 선택하여 문자열 S에서의 순서를 유지하여 만든 모
www.acmicpc.net
• 풀이 과정
• 풀이 코드
import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.OutputStreamWriter;
import java.util.ArrayList;
import java.util.Collections;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
public class Main {
static int k;
static char[] src, tgt;
static Map<String, Integer> map;
public static void main(String[] args) throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(System.out));
String[] input = new String[3];
for (int i = 0; i < 3; i++)
input[i] = br.readLine();
k = Integer.parseInt(br.readLine());
tgt = new char[k];
map = new HashMap<>();
for (int i = 0; i < 3; i++) {
src = input[i].toCharArray();
recur(0, 0);
}
List<String> list = new ArrayList<>(map.keySet());
Collections.sort(list);
StringBuilder sb = new StringBuilder();
for (String key : list) {
if (map.get(key) >= 2)
sb.append(key).append("\n");
}
bw.write(sb.length() > 0 ? sb.toString() : "-1");
bw.flush();
}
private static void recur(int depth, int idx) {
if (idx == k) {
String perm = String.valueOf(tgt);
map.putIfAbsent(perm, 0);
map.put(perm, map.get(perm) + 1);
return;
}
for (int i = depth; i < src.length; i++) {
tgt[idx] = src[i];
recur(i + 1, idx + 1);
}
}
}