[Advance Programming] Soal Case Dan Pembahasan Dalam Java - III

Why-is-Java-the-best-programming-Language

Assalamualaikum wr.wb
Bismillahirrahmannirrahim…
Pada postingan kali ini saya akan melanjutkan tentang soal bahasa pemrograman bahasa Java yang sebelumnya sudah saya bahas di [Advance Programming] Soal Case Dan Pembahasan Dalam Bahasa Java – I. Disini saya akan memberikan beberapa soal  dan pembahasan dari setiap soal tersebut. Setiap soal yang tersedia saya ambil dari HackerRank yang sudah saya terjemahkan ke dalam bahasa indonesia. Soal bisa berbentuk soal cerita dan logika yang bersifat Advance.

1. Cokelat Ulang Tahun
Lily mempunyai Cokelat batangan berdasarakan jumlah kotak n dimana setiap kotak terdapat sebuah integer didalamnya. Dia ingin membagikan nya kepada Ron untuk ulang tahunnya, dimana jatuh pada bulan m dan hari d . Lily hanya ingin memberikan Ron sepotong cokelat yang berisi  m kotak yang berurutan dimana jika dijumlah hasilnya d.


Diberikan m,d  dan urutan dari integer yang ditulis pada setiap kotak pada Cokelat batang lily, Berapa banyak cara yang bisa dilakukan Lily untuk membagi Cokelatnnya ke Ron?
Contoh, jika m = 2, d = 3 dan cokelat batangan berisi n kotak dengan integer [1,2,1,3,2] ditulis dari kiri ke kanan, diagram berikut menunjukkan berapa banyak cara membagikan kue tersebut.

image

Input Format :
- Baris pertama mengandung sebuah integer yang menunjukkan jumlah n (jumlah kotak pada cokelat batangan)
- Baris kedua mengandung n integer yang dipisahkan dengan spasi , yang mendeskripsikan jumlah dari barisan Array (Jumlah nilai dari setiap kotak cokelat batangan)
- Baris Ketiga mengandung dua integer yang dipisahkan dengan spasi yang mendeskripsikan jumlah dari  d ( Hari ulang tahun Ron) dan m (Bulan ulang tahun Ron).

Output Format :
Print sebuah integer yang menunjukan total cara yang bisa dilakukan Lily untuk membagi potongan cokelat itu ke Ron.

Sample Input 1 :
5 
1 2 1 3 2
3 2

Sample Output 1:
 2 

Penjelasan 1: Sudah dijelaskan pada gambar diatas.

Sample Input 2:
6
1 1 1 1 1 1
3 2

Sample Output :
 0 

Penjelasan 2:
Lily hanya ingin memberikan Ron m  = 2 potong kue secara berurutan dengan jumlah total pemjumlahannya adalah  d = 3 , tetapi disana tidak mungkin memberikan keping cokelat.
image
Maka dari itu, kita print 0 ,karena tidak ada cara untuk membaginya.

Jawab :
 import java.io.*;
import java.util.*;
import java.text.*;
import java.math.*;
import java.util.regex.*;

public class Solution {

    static int solve(int n, int[] s, int d, int m){
        
        // initialize variable
        int startingIndex =0;
        int result = 0;
        int total = 0;
        
        // looping Array n
        for(int i=0 ;i < n;i++){
            startingIndex = i;
            
            // gunakan try catch untuk mengantisipasi IndexOutOfRange 
            try{
                // Looping jumlah potongan kue yang dibutuhkan
                for(int j=0; j < m; j++){
                    // jumlahkan total dengan index berikutnya
                    total += s[startingIndex + j];
                }   
            }catch(Exception e){
                break;
            }
            
            // jika total sama dengan d
            if(total == d){
                result++; // result tambah 
            }
            // reset total menjadi 0
            total = 0;
        }
        return result;
    }
    
    public static void main(String[] args) {
        Scanner in = new Scanner(System.in);
        int n = in.nextInt();
        int[] s = new int[n];
        for(int s_i=0; s_i < n; s_i++){
            s[s_i] = in.nextInt();
        }
        int d = in.nextInt();
        int m = in.nextInt();
        int result = solve(n, s, d, m);
        System.out.println(result);
    }
}

Solusi Logika :
1. Pertama kita 3 variable , startingIndex , result, dan total.
2. Looping dengan parameter kurang dari n , hasil variabel looping nya kita gunakan untuk startingIndex.
3. Lalu gunakan Try – Catch, kenapa?, untuk mengantisipasi index array yang melebihi batas. karena kita akan melakukan pengulangan dari startingIndex array dengan index berikutnya.
4. Looping jumlah potongan kue yang dibutuhkan atau variable m, looping ini digunakan untuk membuat variable total
5. variabel total ditambahkan dengan array index berikutnya.
6. Jika array melebihi batas ,maka break
7. Jika total sama dengan d maka result tambah satu dan reset total.


2. Toko Elektronik
Monica ingin membeli tepat satu keyboard  dan satu USB drive dari toko elektronik fahoritnya. Toko menjual n macam brand keyboard  yang berbeda dan m macam brand USB drive yang berbeda.Monica hanya mempunyai s dollar untuk dibelanjakan. dan dia ingin membelanjakan uang itu sebanyak mungkin.( total uang yang ia keluarkan harus maximal)

Diberikan daftar harga keyboard dan USB drive, temukan dan print jumlah uang yang Monica habiskan. jika dia tidak memiliki cukup uang untuk membeli satu keyboard dan satu USB drive, print 1 . 

catatan : dia tidak akan membeli lebih dari satu keyboard dan satu USB drive bahkan jika dia punya uang lebih.

Input Format :
- Baris pertama berisi tiga angka integer yang dipisah oleh spasi yang mendeskripsikan masing – masing nilai dari s ( Jumlah uang Monica ) , n ( Jumlah tipe keyboard yang ada ditoko) , m ( Jumlah tipe USB Drive yang ada di toko).
- Baris kedua berisi n angka integer yang dipisahkan dengan spasi yang menunjukkan harga dari setiap brand Keyboard.
- Baris kedua berisi m angka integer yang dipisahkan dengan spasi yang menunjukkan harga dari setiap brand  USB Drive.

Output :
Print sebuah integer yang menunjukkan jumlah uang yang Monica habiskan. Jika dia tidak memiliki cukup uang untuk membeli satu keyboard and satu USB Drive, print –1 .

Sample Input 1 :
10 2 3
3 1
5 2 8

Sample Output 1 :
9

Penjelasan :
Dia bisa membeli keyboard ke 2 dan USB Drive ke 3 dengan jumlah uang yang ia keluarkan 8 + 1 = 9

Sample Input 2 :
5 1 1
4
5

Sample Output 2 :
-1

Penjelasan :
Disitu tidak ada satupun cara untuk satu membeli keyboard dan USB Drives karena 4 + 5 > 5 , jadi kita print –1

Jawab :

import java.io.*;
import java.util.*;
import java.text.*;
import java.math.*;
import java.util.regex.*;

public class Solution {

    static int getMoneySpent(int[] keyboards, int[] drives, int s){
        // initalize variable
        int max = -1;
        
        // urutkan Array keyboards (Descending)
        for(int i = 0; i < keyboards.length; i++){
            for(int j = 0; j < keyboards.length; j++){
                if(keyboards[i] > keyboards[j]){
                    int a = keyboards[i];
                    keyboards[i] = keyboards[j];
                    keyboards[j] = a;    
                }
            }
        }

        // urutkan Array Drives (Ascending)
        Arrays.sort(drives);
        
        // Looping semua array dengan nested loop
        for(int i = 0;i < keyboards.length;i++){
            for(int j = 0; j < drives.length;j++){
                // jika total harga lebih dari uang monika , maka break
                if(keyboards[i] + drives[j] > s ) break;
                // jika total harga lebih besar dari max , maka  max ganti
                if(keyboards[i] + drives[j] > max) max = keyboards[i] + drives[j];
            }
        }
        
        return max;
    }

    public static void main(String[] args) {
        Scanner in = new Scanner(System.in);
        int s = in.nextInt();
        int n = in.nextInt();
        int m = in.nextInt();
        int[] keyboards = new int[n];
        for(int keyboards_i=0; keyboards_i < n; keyboards_i++){
            keyboards[keyboards_i] = in.nextInt();
        }
        int[] drives = new int[m];
        for(int drives_i=0; drives_i < m; drives_i++){
            drives[drives_i] = in.nextInt();
        }
        //  The maximum amount of money she can spend on a keyboard and USB drive, or -1 if she can't purchase both items
        int moneySpent = getMoneySpent(keyboards, drives, s);
        System.out.println(moneySpent);
    }
}

Solusi Logika :
1. Pertama kita buat variable max dengan nilai –1 ( untuk mengindikasian uang Monica yang tidak cukup )
2. Urutkan Array keyboard secara descending. (Dari yang terbesar ke terkecil)
3. Urutkan Array USB Drive secara ascending . (Dari yang terkecil ke terbesar).
4. Hal ini digunakan agar memudahkan mencari nilai maximal.
5. Lalu looping semua array (keyboard dan drives) dengan menggunakan nestedloop.
6. Jika total harga lebih dari uang monica , maka break lanjut ke looping selanjutnya.
7. Jika total harga lebih besar dari max , maka max diganti pemjumlahan tersebut.

3. Tikus Dan Kucing
Dua kucing dan satu tikus berada pada posisi yang beragam. Kamu akan diberi posisi pertama mereka. Tugasmu yaitu tentukan kucing mana yang akan mendapatkan tikus itu pertama kali, diasumsikan tikus tidak bergerak dan kucing berjalan pada kecepatan yang sama. Jika kucing tiba pada saat yang sama, si tikus akan bergerak dan dia dapat bebas selama mereka bertarung.

Kamu diberikan q  query di dalam form dari x , y , z  yang mewakili masing masing posisi dari kucing A dan  B ,dan untuk tikus C . Selesaikan function catAndMouse untuk return jawaban yang benar untuk setiap query, dimana akan di print pada baris yang baru.
  • Jika kucing A , menangkap tikus terlebih dahulu maka print  “Cat A”
  • Jika kucing B , menangkap tikus terlebih dahulu maka print “Cat B”
  • Jika kedua kucing tiba pada saat yang sama, print “Mouse C” sebagai hasil dari pertarungan kedua kucing dan tikus membebaskan diri.

Function Description :
Lengkapi function catAndMouse   yang diberikan 3 parameter.
1. Integer , x  menunjukan lokasi kucing A.
2, Integer, y menunjukan lokasi kucing B.
3. Integer, z menunjukan lokasi tikus C

Input Format :
- Baris pertama berisi sebuah integer q yang menunjukkan jumlah query
- Baris Kedua yaitu Setiap baris query berisi 3 angka yang dipisahkan spasi yang mendeskripsikan nilai dari x (Lokasi kucing A) , y (Lokasi Kucing B), z (Lokasi Tikus C)

Output Format :
Setiap query , return “Cat A” jika Kucing A menangkap tikus terlebih dahulu, “Cat B” jika Kucing B menangkap tikus terlebih dahulu, atau “Mouse C” jika tikus berhasil lolos.

Sample Input :
2
1 2 3
1 3 2

Sample Output :
Cat B
Mouse C

Penjelasan :
Query 1 : Posisi para kucing dan kucing, seperti yang terlihat di bawah ini :
image
kucing B akan menangkap tikus terlebih dahulu , maka kita print “Cat B” .

Query 2 : Pada query ini, Kucing A dan Kucing B mencapai posisi yang sama saat mengejar tikus :
image
karena posisi kucing pada tikus mencapai nilai yang sama, maka Tikus C lolos , Sehingga kita print “Mouse C”

Jawab :

import java.io.*;
import java.math.*;
import java.text.*;
import java.util.*;
import java.util.regex.*;

public class Solution {


    /*
     * Complete the catAndMouse function below.
     */
    static String catAndMouse(int x, int y, int z) {
         // jika posisi kucing A dan Kucing B dengan tikus C memiliki jarak yang sama 
         if(Math.abs(x-z) == Math.abs(y-z)){
           return "Mouse C";
         }

         // jika posisi kucing A jaraknya lebih DEKAT dengan tikus C daripada Kucing B 
         if(Math.abs(x-z) < Math.abs(y-z)){
           return "Cat A";
         }

          // jika posisi kucing A jaraknya lebih JAUH dengan tikus C daripada Kucing B
         if(Math.abs(x-z) > Math.abs(y-z)){ 
           return "Cat B";
         }
    return null;
    }


    private static final Scanner scan = new Scanner(System.in);

    public static void main(String[] args) throws IOException {
        BufferedWriter bw = new BufferedWriter(new FileWriter(System.getenv("OUTPUT_PATH")));

        int q = Integer.parseInt(scan.nextLine().trim());

        for (int qItr = 0; qItr < q; qItr++) {
            String[] xyz = scan.nextLine().split(" ");

            int x = Integer.parseInt(xyz[0].trim());

            int y = Integer.parseInt(xyz[1].trim());

            int z = Integer.parseInt(xyz[2].trim());

            String result = catAndMouse(x, y, z);

            bw.write(result);
            bw.newLine();
        }

        bw.close();
    }
}


Solusi Logika :
1. Disini terdapat clue bahwa semua kucing memiliki kecepatan yang sama.
2. Maka yang harus kita bedakan adalah jarak antar kucing dengan tikus.
3. Jika jarak salah satu kucing lebih dekat dengan tikus, maka kucing tersebutlah yang menang.
4. JIka jarak antar kucing dengan tikus sama, maka tikus akan lolos.

0 Response to "[Advance Programming] Soal Case Dan Pembahasan Dalam Java - III"

Posting Komentar

Iklan Atas Artikel

Iklan Tengah Artikel 1

Iklan Tengah Artikel 2

Iklan Bawah Artikel