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

}