Halo teman-teman, apa kabar? Kali ini saya ingin membahas sedikit tentang salah satu problem yang ada di web rosalind.info. Judulnya ialah "Introduction to Random Strings". Sebagai acuan, teman-teman bisa cek dahulu problem yang akan kita bahas (disini).
Overview
Di problem ini kita akan disajikan sebuah string (sebut saja string s) dan sebuah array integer (sebut saja array A[]) yang berisikan angka gc-content. Gc-content sendiri ialah suatu nilai yang mewakili probabilitas kemunculan senyawa gianine ('G') dan cytosine ('C') dalam suatu DNA. Sedangkan string s disini mewakili urutan "random string DNA".
Tugas kita ialah menentukan probabilitas dari string s menggunakan acuan gc-content yang ada di array A[]. Lalu nilai probabilitas tersebut (sebut saja x) kita ubah nilainya menggunakan log10 dengan rumus log10 (x).
Idenya disini ialah memasukan probabilitas dari gc-content ke dalam string s: nilai (gc-content / 2) untuk 'G' dan 'C', sedangkan 'A' dan 'T' menggunakan nilai ((1 - gc-content) / 2). Sebagai contoh, suatu DNA memiliki gc-content 0.6, dan kita ingin menemukan nilai dari random string "ACGA". Maka kita masukan per masing-masing karakter: 'A' = 0.2 (0.4 / 2), 'C' = 0.3 (0.6 / 2), 'G' = 0.3, dan 'A' = 0.2. Kalikan semua, maka kita akan mendapatkan angka 0.0036. Jawabannya ialah log10 dari 0.0036.
Kode Pengerjaan
Berikut kode pengerjaannya dalam bahasa java :
- public void solve() {
- Scanner sc = new Scanner(System.in);
- String s = sc.next();
- int GC = 0;
- int AT = 0;
- for (char c : s.toCharArray()) if (c == 'G' || c == 'C') GC++; else AT++;
- while (sc.hasNext()) {
- double gcContent = Double.parseDouble(sc.next());
- out.printf("%.3f\n", Math.log10(Math.pow(gcContent / 2, GC) * Math.pow((1 - gcContent) / 2, AT)));
- }
- }
Penjelasan Kode
Pertama, kita masukan dahulu jumlah kemunculan dari karakter 'G' & 'C' dan 'A' & 'T' (baris 6).
Setelah diketahui jumlahnya, sekarang kita proses angka-angka gc-content yang ada di array A[] menggunakan metode yang telah kita bahas diatas. Untuk mempersingkat proses pengerjaan, disini saya langsung memakai rumus Math.log10(Math.pow(gcContent / 2, GC) * Math.pow((1 - gcContent) / 2, AT)) seperti pada kode diatas (baris 9). Rumus tersebut ialah modifikasi dari rumus binomial distribution.
Input dan Output
Seperti yang teman-teman lihat; disini, saya memakai fungsi next() (baris 3) untuk meng-input data string. Sedangkan untuk output-nya saya memakai fungsi out.printf() (baris 9). Fungsi tersebut adalah modifikasi dari fungsi System.out.printf() yang merupakan fungsi default di java. Untuk lebih jelasnya, teman-teman bisa melihat kode tambahan untuk memodifikasi fungsi tersebut (input maupun output) di versi lengkap kode saya di github.
Sekian dari saya. Jika teman-teman ingin menanyakan sesuatu, teman-teman bisa menulisnya di kolom komentar. Semoga bermanfaat dan sampai jumpa di artikel berikutnya!
Referensi :
Sumber gambar 1 :https://www.facebook.com/ProjectRosalind/
No comments:
Post a Comment