Posted by: k41p4nk on: Oktober 9, 2007
Ini sebenarnya berkait ama struktur data koq…. :p
Jadi gini, sebuah deret bilangan dikatakan sebagai Jollyjumper jika selisih dari setiap n deret bilangan integer adalah memuat 1 s/d (n-1). Misal diberikan 5 buah bilangan integer : 5 3 4 7 3. deret bilangan tersebut termasuk Jollyjumper karena selisih bilang ke-1 dengan bilangan ke-, selisih bilangan ke-2 dengan bilangan ke-3, dst memuat 1 s/d (n-1) ~ yaitu 1, 2, 3, 4. Coba kita periksa. Selisih bilangan ke-1 dengan bilangan ke-2 adalah 2, bilangan k-2 dengan bilangan ke-3 adalah 1, bilangan ke-3 dengan bilangan ke-4 adalah 3, bilangan ke-4 dengan bilangan k-5 adalah 4. Karena semua bilangan antara 1 dan 4 (n-1) dimuat oleh selisih-selisih tadi, maka deret bilangan tersebut bisa dikatakan Jollyjumper. Nah kalo misalkan selisihnya ga memuat bilangan-bilangan 1 s/d (n-1), tentu saja bilangan tersebut bukanlah Jollyjumper.
Gimana udah paham belum? kalo udah paham kita akan coba buat program untuk menganalisa apakah sebuah deret bilangan termasuk Jollyjumper atau bukan. Idenya sebenarnya menggunakan algoritma dengan pendekata bruteforce. Ide ini bukanlah satu-satunya. Karena masih ada pendekatan-pendekatan lain yang tentunya akan memunculkan algoritma-algoritma yang berbeda pula. Termasuk didalamnya adalah kompleksitas dan efisiensi algoritma yang dihasilkan.
Jadi begini, program kita akan menerima inputan dari standar input (thanx for mas ferdhie atas pencerahan stdIn di java…) berupa nama file, nah kita akan mendapatkan isi dari file tersebut secara otomatis menggunakan teknik pipe di *NIX. Setelah kita dapat deretnya, maka kita akan proses deret tersebut. Sebelum proses dimulai kita butuh sebuah flag penanda jollyjumper, dan sebuah wadah untuk menyimpan setiap selisih dari bilangan-bilangan yang kita cek. Pengecekan akan kita mulai dari bilangan urutan ke 1 (Urutan dimulai dari 0). Dengan cara kita cari nilai absolut selisih atara bilangan ke-1 dengan bilangan ke-0. Setelah didapat nilai selisihnya, kita lakukan pengecekan apakah selisih yang kita hitung barusan ada didalam wadah yang kita sediakan atau tidak, jika ada maka bisa dipastikan deret bilangan tersebut bukanlah Jollyjumper. Namun jika selisihnya belum ada, maka kita simpan selisih tersebut dalah wadah tadi kemudian melakukan pengecekan untuk bilangan selanjutnya.
begini adalah bentuk inputnya (berupa file text):
3 1 2 3
4 4 2 1 5
5 5 3 4 7 3
penjelasan input… tiap baris inputan adalah deret bilangan yang akan diperiksa. Bilangan ke 1 adalah jumlah n dari sebuah deret bilangan. Bilangan k-2 dan seterusnya adalah deret bilangan yang akan dicek apakah termasuk Jollyjumper atau tidak. Contoh baris pertama.. 3 1 2 3 -> angka 3 adalah jumlah bilangan dalam sebuah deret, angka 1 2 3 adalah deret bilangannya.
begini adalah bentuk outputnya (berupa file text):
Not Jolly
Not Jolly
Jolly
Berikut adalah potongan programmnya:
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
public class Jolly {
public static void main(String[] args) {
// TODO Auto-generated method stub
try {
BufferedReader file = new BufferedReader(new InputStreamReader(System.in));
String line = "";
boolean isJolly = true;
while((line = file.readLine()) != null) {
String[] token = line.trim().split(" ");
int numberOfNum = Integer.parseInt(token[0]);
StringBuffer diffs = new StringBuffer();
if (numberOfNum < 2) {
System.out.println("Not Jolly");
} else {
int idx = 2;
isJolly = true;
while(idx < token.length && isJolly) {
int diff = Math.abs(Integer.parseInt(token[idx]) - Integer.parseInt(token[idx-1]));
if (diffs.indexOf(String.valueOf(diff)) >= 0 || diff >= numberOfNum || diff == 0) {
isJolly = false;
} else {
isJolly = true;
diffs.append(String.valueOf(diff));
}
idx++;
}
System.out.println(isJolly ? "Jolly" : "Not Jolly");
}
}
} catch(IOException ioE) {
}
}
}
Silahkan simpan dengan nama file Jolly.java lalu lakukan kompilasi. Jika ingin menbuat native executable di Linux silahkan compile menggunakan gcj. Atau kalo ingin membuat class file supaya bisa di-running dimana aja, silahkan compile menggunakan javac. Setelah itu jalankan menggunakan ~ ./Jolly < input.txt > output.txt
Silahkan mencoba..
Oktober 31, 2007 pada 3:17 pm
salam kenal dari http://pcmavrc.wordpress.com