diff --git a/src/main/java/code/league/mei/MelipatDeathNote.java b/src/main/java/code/league/mei/MelipatDeathNote.java new file mode 100644 index 0000000..2c4d7f2 --- /dev/null +++ b/src/main/java/code/league/mei/MelipatDeathNote.java @@ -0,0 +1,30 @@ +import java.util.Scanner; + +public class MelipatDeathNote { + public static void main(String[] args) { + Scanner in = new Scanner(System.in); + + // Memasukkan input dari user + int p = in.nextInt(); + int q = in.nextInt(); + int m = in.nextInt(); + + // Melakukan pengecekan pada panjang dan lebar sebanyak M kali + // Setelah dilakukan pengecekan, yang terpanjang akan dibagi 2 + while (m > 0) { + if (p > q) { + p /= 2; + m--; + } else { + q /= 2; + m--; + } + } + + // Menampilkan hasil perhitungan + System.out.println(p + " " + q); + + // Menutup Scanner (Opsional) + in.close(); + } +} diff --git a/src/main/java/code/league/mei/PenjadwalanMusik.java b/src/main/java/code/league/mei/PenjadwalanMusik.java new file mode 100644 index 0000000..c61331b --- /dev/null +++ b/src/main/java/code/league/mei/PenjadwalanMusik.java @@ -0,0 +1,50 @@ +public class PenjadwalanMusik { + public static int findMaximumBeauty(int[] songDurations, int[] songBeauties, int totalTime) { + // Mendapatkan jumlah penyanyi + int n = songDurations.length; + // Matriks dp untuk menyimpan hasil perhitungan + int[][] dp = new int[n + 1][totalTime + 1]; + + // Melakukan perhitungan untuk setiap penyanyi dan waktu yang tersedia + for (int i = 1; i <= n; i++) { + int duration = songDurations[i - 1]; + int beauty = songBeauties[i - 1]; + + for (int j = 0; j <= totalTime; j++) { + if (duration <= j) { + // Memilih antara mengambil lagu atau tidak mengambil lagu + dp[i][j] = Math.max(dp[i - 1][j], dp[i - 1][j - duration] + beauty); + } else { + // Jika durasi lagu melebihi waktu yang tersedia, tidak mengambil lagu tersebut + dp[i][j] = dp[i - 1][j]; + } + } + } + + // Mengembalikan keindahan maksimum yang dapat dicapai + return dp[n][totalTime]; + } + + public static void main(String[] args) { + Scanner scanner = new Scanner(System.in); + + // Membaca jumlah penyanyi + int n = scanner.nextInt(); + + // Membaca durasi dan keindahan lagu untuk setiap penyanyi + int[] songDurations = new int[n]; + int[] songBeauties = new int[n]; + for (int i = 0; i < n - 1; i++) { + songDurations[i] = scanner.nextInt(); + songBeauties[i] = scanner.nextInt(); + } + + // Membaca batasan waktu + int totalTime = scanner.nextInt(); + + // Memanggil fungsi untuk mencari keindahan maksimum + int maximumBeauty = findMaximumBeauty(songDurations, songBeauties, totalTime); + // Mencetak keindahan maksimum + System.out.println(maximumBeauty); + } +} \ No newline at end of file diff --git a/src/main/java/code/league/mei/README.md b/src/main/java/code/league/mei/README.md new file mode 100644 index 0000000..f9ec882 --- /dev/null +++ b/src/main/java/code/league/mei/README.md @@ -0,0 +1,141 @@ +## Mei Edition + +Link soal : https://www.hackerrank.com/code-league-5 + +### 1. Skor Matriks Pak Dengklek + +Salah satu penyelesaian dari soal ini adalah dengan melakukan sorting terlebih dahulu pada tiap matriks m di dalam matriks genshin. Setelah itu, matriks genshin dapat diiterasikan untuk mendapatkan nilai maks dari matriks m ( index ke-0 setelah disorting). Setelah itu, nilai yang didapat akan disimpan pada sebuah list sementara dan nilai tersebut dihapus dari matriks m. Setelah m kali iterasi, skor akan ditambah dengan nilai maksimum dari list sementara tersebut. Berikut contoh dari penyelesaian salah satu soal pada test case : + +| 7 | 2 | 1 | +|:--:|:--:|:--:| +| 6 | 4 | 2 | +| 6 | 5 | 3 | +| 3 | 2 | 1 | + +perulangan 1 : nilai maksimum tiap m matriks pada genshin [7, 6, 6, 3] , nilai dihapus, dan score ditambah dengan nilai maksimum dari matriks tersebut. ($score += 7$) + +| 2 | 1 | +|:--:|:--:| +| 4 | 2 | +| 5 | 3 | +| 2 | 1 | + +perulangan 2 : nilai maksimum tiap m matriks pada genshin [2, 4, 5, 2], nilai dihapus, dan score ditambah dengan nilai maksimum dari matriks tersebut. ($score += 5$) + +| 1 | +|:--:| +| 2 | +| 3 | +| 1 | + +perulangan 3 : nilai maksimum tiap m matriks pada genshin [1, 2, 3, 1], nilai dihapus, dan score ditambah dengan nilai maksimum dari matriks tersebut. ($score += 3$) + +$score = 7 + 5 + 3 = 15$ + +Lihat jawaban disini : [Skor Matriks Pak Dengklek](SkorMatriksPakDengklek.java) + +### 2. Bowo Si Tukang Susu + +Bowo adalah seorang tukang susu. Ia menyediakan paket botol susu dalam ukuran yang bervariasi. Jenis-jenis ukurang yang mungkin untuk botol susu adalah {1, 5, 7, dan 10} liter. Bowo ingin mensuplai setiap liter air susu kedalam botol sesedikit mungkin. Tolong bantu bowo untuk menemukan jumlah minimum botol yang diperlukan untuk memasok permintaan susu yang diberikan. + +15 Liter = (10 + 1) + (5 + 1) => 2 +15 Liter = (10 Liter + 1 Botol) + (5 Liter + 1 Botol) => 15 Liter | 2 Botol + +9 Liter = (7 + 1) + (1 + 2) => 3 +9 Liter = (7 Liter + 1 Botol) + (1 Liter + 2 Botol) => 9 Liter | 3 Botol + +Lihat jawaban disini : [Bowo Si Tukang Susu](bowoSiTukangSusu.java) + +### 3. Urutkan Kurawal-ku +Seperti yang kita tahu, tanda kurung memiliki banyak jenis. Dan dalam penggunaan secara bersama kurung harus diletakkan sesuai dengan posisinya. +Contoh : "{()}" +Didalam contoh kita dapat menemukan 2 jenis kurung, diantaranya kurung "{}" dan "()". +Keduanya harus diletakkan dengan posisi yang benar untuk mendapatkan keluaran hasil terutama dalam operasi penghitungan. + +Pada soal ini, Peserta diharuskan untuk memrancang sebuah program berbasis code yang dapat mengecek kebenaran dalam posisi tumpukan tanda kurung. +Dan seperti diatas, tumpukan kurung dianggap seimbang jika setiap karakter pembuka memiliki karakter penutup dengan urutan yang benar. + +Untuk metode penyelesaian bisa digunakan dengan memanggil library internal java yakni "tumpukan". +tumpukan digunakan untuk mengorganisir setiap karakter dari inputan yang di buat + +Penjelasan Algoritma: + +1. Akan dilakukan perulangan sebanyak jumlah karakter yang diinput + ex: {()} = 4 Perulangan. +2. Teks akan diubah menjadi variabel char dengan mengestrak setiap karakter dalam teks +3. Karakter akan selalu dimasukkan pada sebuah tumpukan +4. Didalam perulangan akan terdapat sebuah perilaku seleksi dimana seleksi akan memilah antara karakter pembuka seperti "{", "[]" , "(". Jika terdapat diantaranya maka akan dimasukkan kedalam sebuah tumpukan tumpukan + Jika karakter "c" bukanlah tanda kurung buka, maka dilakukan pengecekan lebih lanjut: + a. Jika tumpukan kosong, artinya tidak ada tanda kurung buka yang sesuai untuk karakter "c", maka method mengembalikan nilai false. + b. Jika tumpukan tidak kosong, karakter teratas dari tumpukan diambil menggunakan pemanggilan "tumpukan.pop()" dan disimpan dalam variabel "top". + c. Dilakukan pengecekan apakah karakter "c" sesuai dengan tanda kurung tutup yang diharapkan berdasarkan karakter teratas tumpukan: + Jika karakter "c" adalah ')' dan karakter teratas tumpukan bukan '(', maka method mengembalikan nilai false. + Jika karakter "c" adalah ']' dan karakter teratas tumpukan bukan '[', maka method mengembalikan nilai false. + Jika karakter "c" adalah '}' dan karakter teratas tumpukan bukan '{', maka method mengembalikan nilai false. +5. Setelah selesai memeriksa semua karakter dalam string "s", dilakukan pengecekan apakah tumpukan kosong. Jika tumpukan kosong, artinya semua tanda kurung telah seimbang, + +Lihat jawaban disini : [Urutkan Kurawal-ku](urutkanKurawalKu.java) + +### 4. Penjadwalan Acara Musik + +1. Membaca Jumlah Penyanyi: + + Menggunakan Scanner, baca nilai integer dari input sebagai n, yang merupakan jumlah penyanyi. + Membaca Durasi dan Keindahan Lagu; + +2. Buat dua array songDurations dan songBeauties dengan panjang n yang telah diinputkan tadi. + Selanjutnya, menggunakan loop for dengan perulangan sebanyak jumalah penyanyi dikurang 1, baca nilai integer dari input dan simpan ke dalam array songDurations dan songBeauties masing-masing sesuai dengan indeksnya; + +3. Kemudian setelah itu membaca Batasan Waktu + +4. Setelah semua input sudah dibaca + Invoke Fungsi findMaximumBeauty,Fungsi ini menerima tiga parameter, yaitu songDurations (array berisi durasi dari setiap lagu), songBeauties (array berisi keindahan dari setiap lagu), dan totalTime (batasan waktu); + +5. Didalam fungsi findMaximumBeauty + -Kita membuat Variabel n yang diambil dari panjang Array songDurations, + setelah itu menginisiasi Matriks dp dengan panjang baris dari nilai n+1 dan kolom total time - 1; + + -Kemudia membuat iterasi yang dilakukan untuk setiap penyanyi dan waktu yang tersedia; + + -Jika durasi lagu saat ini lebih kecil atau sama dengan waktu yang tersedia, maka keindahan maksimum pada waktu tersebut adalah maksimum antara keindahan maksimum dari penyanyi sebelumnya pada waktu yang sama atau keindahan maksimum dari penyanyi sebelumnya pada waktu yang lebih sedikit ditambah keindahan lagu saat ini.; + + -Jika durasi lagu saat ini lebih besar dari waktu yang tersedia, maka keindahan maksimum pada waktu tersebut adalah keindahan maksimum dari penyanyi sebelumnya pada waktu yang sama.; + + -Kembalikan keindahan maksimum yang dapat dicapai pada waktu total yang tersedia; + +6. Setelah proses Invoke fungsi telah selesai,maka simpan nilai yang direturn fungsi tersebut kedalam variabel + Maximum Beauty,setelah itu tampilkan + + +Lihat jawaban disini : [Penjadwalan Acara Musik](PenjadwalanMusik.java) + +### 5. Melipat Death Note +Untuk menjawab soal ini, kita perlu mengecek mana yang lebih panjang antara kedua inputan (kita anggap saja P dan Q). Yang paling panjang akan kita bagi dengan 2. hal ini kita lakukan perulangan sebanyak M kali. Dan jika ada diantara kedua inputan yang bernilai ganjil, maka kita akan melakukan pembulatan ke bawah. + +Contoh: +P = 10 +Q = 8 +M = 3 + +* pada Pelipatan pertama( M = 1 ): + P > Q, maka P akan dibagi 2. + P = 10/2 + + P = 5, Q = 8 + +* pada pelipatan kedua ( M = 2 ) + Q > P, maka Q akan dibagi 2. + Q = 8/2 + + P = 5, Q = 4 + +* pada pelipatan ketiga( M = 3 ) + P > Q, maka P akan dibagi 2. + P = 5/2 + P = 2 (2,5 dibulatkan kebawah menjadi 2) + + P = 2, Q = 10 + +Setelah semua perulangan telah dilakukan maka tampilkan P dan Q secara berurutan (Jangan sampai terbalik). + +Lihat jawaban disini : [Melipat Death Note](MelipatDeathNote.java) diff --git a/src/main/java/code/league/mei/SkorMatriksPakDengklek.java b/src/main/java/code/league/mei/SkorMatriksPakDengklek.java new file mode 100644 index 0000000..840b216 --- /dev/null +++ b/src/main/java/code/league/mei/SkorMatriksPakDengklek.java @@ -0,0 +1,78 @@ +import java.io.*; +import java.math.*; +import java.security.*; +import java.text.*; +import java.util.*; +import java.util.concurrent.*; +import java.util.function.*; +import java.util.regex.*; +import java.util.stream.*; +import static java.util.stream.Collectors.joining; +import static java.util.stream.Collectors.toList; + +class Result { + + /* + * Complete the 'SkorMatriksPakDengklek' function below. + * + * The function is expected to return an INTEGER. + * The function accepts 2D_INTEGER_ARRAY genshin as parameter. + */ + + public static int SkorMatriksPakDengklek(List> genshin) { + // Fungsi penyelesaian + int score = 0; + + // melakukan sorting pada tiap nilai pada matriks genshin + for (int i = 0; i < genshin.size(); i++){ + Collections.sort(genshin.get(i)); + } + + // melakukan iterasi pada matriks yang telah tersorting + for (int i = 0; i < genshin.get(0).size(); i++) { + int maxi = 0; + for (int j = 0; j < genshin.size(); j++) { + maxi = Math.max(genshin.get(j).get(i), maxi); + } + // menambah nilai score dengan nilai maksimum + score += maxi; + } + + return score; + } +} + +public class Solution { + public static void main(String[] args) throws IOException { + BufferedReader bufferedReader = new BufferedReader(new InputStreamReader(System.in)); + BufferedWriter bufferedWriter = new BufferedWriter(new FileWriter(System.getenv("OUTPUT_PATH"))); + + String[] firstMultipleInput = bufferedReader.readLine().replaceAll("\\s+$", "").split(" "); + + int m = Integer.parseInt(firstMultipleInput[0]); + + int n = Integer.parseInt(firstMultipleInput[1]); + + List> genshin = new ArrayList<>(); + + IntStream.range(0, m).forEach(i -> { + try { + genshin.add( + Stream.of(bufferedReader.readLine().replaceAll("\\s+$", "").split(" ")) + .map(Integer::parseInt) + .collect(toList()) + ); + } catch (IOException ex) { + throw new RuntimeException(ex); + } + }); + + int result = Result.SkorMatriksPakDengklek(genshin); + + bufferedWriter.write(String.valueOf(result)); + bufferedWriter.newLine(); + + bufferedReader.close(); + bufferedWriter.close(); + } +} \ No newline at end of file diff --git a/src/main/java/code/league/mei/bowoSiTukangSusu.java b/src/main/java/code/league/mei/bowoSiTukangSusu.java new file mode 100644 index 0000000..5954dfe --- /dev/null +++ b/src/main/java/code/league/mei/bowoSiTukangSusu.java @@ -0,0 +1,44 @@ +import java.util.Scanner; + +public class bowoSiTukangSusu { + public static void main(String[] args) { + Scanner sc = new Scanner(System.in); + int[] literBotol = {1, 5, 7, 10}; + int literSusu; + int hitungBotol = 0; + + int n = sc.nextInt(); + + if (n <= 0){ + System.out.println("Coba lagi!"); + System.exit(0); + } + for(int i = 0;i= literBotol[3]){ + literSusu -= literBotol[3]; + hitungBotol++; + } else if (literSusu >= literBotol[2]){ + literSusu -= literBotol[2]; + hitungBotol++; + } else if (literSusu >= literBotol[1]){ + literSusu -= literBotol[1]; + hitungBotol++; + } else if (literSusu >= literBotol[0]){ + literSusu -= literBotol[0]; + hitungBotol++; + } + } + System.out.println(hitungBotol); + hitungBotol = 0; + } + + } +} \ No newline at end of file diff --git a/src/main/java/code/league/mei/urutkanKurawalKu.java b/src/main/java/code/league/mei/urutkanKurawalKu.java new file mode 100644 index 0000000..59e4ad6 --- /dev/null +++ b/src/main/java/code/league/mei/urutkanKurawalKu.java @@ -0,0 +1,43 @@ +import java.util.Scanner; +import java.util.Stack; + +public class urutkanKurawalKu { + public static void main(String[] args) { + Scanner input = new Scanner(System.in); + int T = input.nextInt(); // Jumlah kasus uji + + for (int i = 0; i < T; i++) { + String s = input.next(); // Urutan karakter-karakter + + if (isBalanced(s)) { + System.out.println("YES"); + } else { + System.out.println("NO"); + } + } + } + + static boolean isBalanced(String s) { + Stack stack = new Stack<>(); + + for (int i = 0; i < s.length(); i++) { + char c = s.charAt(i); + + if (c == '(' || c == '[' || c == '{') { + stack.push(c); + } else { + if (stack.isEmpty()) { + return false; + } + + char top = stack.pop(); + + if ((c == ')' && top != '(') || (c == ']' && top != '[') || (c == '}' && top != '{')) { + return false; + } + } + } + + return stack.isEmpty(); + } +}