import java.util.ArrayList;
import java.util.List;

public class ResolusiTransitif {

    // Setiap artifact dan daftar dependency-nya (versi disederhanakan).
    private static final String[] NAMA = {
        "aplikasi-gudang", "jackson-databind", "logback-classic",
        "jackson-core", "jackson-annotations", "logback-core"
    };

    private static final String[][] DEPENDENSI = {
        {"jackson-databind", "logback-classic"},   // aplikasi-gudang
        {"jackson-core", "jackson-annotations"},   // jackson-databind
        {"logback-core"},                          // logback-classic
        {},                                        // jackson-core
        {},                                        // jackson-annotations
        {}                                         // logback-core
    };

    private static final List<String> dikunjungi = new ArrayList<>();
    private static final List<Integer> kedalaman = new ArrayList<>();

    public static void main(String[] args) {
        telusuri("aplikasi-gudang", 0);

        int langsung = 0;
        int transitif = 0;
        for (int i = 0; i < dikunjungi.size(); i++) {
            System.out.printf("kedalaman %d: %s%n", kedalaman.get(i), dikunjungi.get(i));
            if (kedalaman.get(i) == 1) {
                langsung++;
            } else if (kedalaman.get(i) >= 2) {
                transitif++;
            }
        }
        System.out.println();
        System.out.println("dependency langsung : " + langsung);
        System.out.println("dependency transitif: " + transitif);
    }

    /** DFS: catat artifact lalu turuti dependency-nya secara berurutan. */
    private static void telusuri(String nama, int kedalamanSekarang) {
        if (dikunjungi.contains(nama)) {
            return;
        }
        dikunjungi.add(nama);
        kedalaman.add(kedalamanSekarang);

        for (String dependen : DEPENDENSI[indeks(nama)]) {
            telusuri(dependen, kedalamanSekarang + 1);
        }
    }

    private static int indeks(String nama) {
        for (int i = 0; i < NAMA.length; i++) {
            if (NAMA[i].equals(nama)) {
                return i;
            }
        }
        throw new IllegalArgumentException("artifact tidak dikenal: " + nama);
    }
}
