Halo teman-teman, apa kabar? Kali ini saya ingin membahas sedikit tentang salah satu problem yang ada di web rosalind.info. Judulnya ialah "Overlap Graphs". Sebagai acuan, teman-teman bisa cek dahulu problem yang akan kita bahas (disini).
Di problem ini kita akan disajikan beberapa string dalam bentuk FASTA format yang berisikan urutan-urutan DNA (jumlah tidak diketahui). Tugas kita ialah menentukan pasangan dari string-string tersebut. Dua string bisa disebut berpasangan jika 3 huruf terakhir (suffix) dari string pertama sama dengan 3 huruf awal (prefix) dari string kedua. Sebagai contoh, string "CGAAC" dapat dipasangkan dengan string "AACTT" dengan "AAC" sebagai 3 huruf yang sama; "CGAAC" adalah string pertama, "AACTT" adalah string kedua.
Cara pengerjaannya sendiri cukup sederhana: kita hanya perlu memasangkan string-string tersebut dengan prinsip prefix-suffix seperti yang sudah dijelaskan diatas.
Berikut kode pengerjaannya dalam bahasa java :
- static class Data {
- String name = "";
- String strand = "";
- Data (String name, String strand) {
- this.name = name;
- this.strand = strand;
- }
- }
- static void tambahCekEkor (String strand, String name, HashMap<String, Vector<String>> cekEkor, Vector<Data> peserta) {
- String suffix = strand.substring(strand.length() - 3);
- if (cekEkor.get(suffix) == null) {
- cekEkor.put(suffix, new Vector<>());
- }
- cekEkor.get(suffix).add(name);
- peserta.add(new Data(name, strand));
- }
- static void solve() {
- Scanner sc = new Scanner(System.in);
- HashMap<String, Vector<String>> cekEkor = new HashMap<>();
- Vector<Data> peserta = new Vector<>();
- String name = sc.next().substring(1);
- while (sc.hasNext()) {
- boolean last = true;
- String strand = "";
- while (sc.hasNext()) {
- String masuk = sc.next();
- if (masuk.charAt(0) == '>') {
- tambahCekEkor(strand, name, cekEkor, peserta);
- name = masuk.substring(1);
- last = false;
- break;
- }
- strand += masuk;
- }
- if (last) {
- tambahCekEkor(strand, name, cekEkor, peserta);
- }
- }
- for (Data x : peserta) {
- String preffix = x.strand.substring(0, 3);
- if (cekEkor.get(preffix) != null) {
- for (String s : cekEkor.get(preffix)) {
- if (s != x.name) out.println(s + " " + x.name);
- }
- }
- }
- }
Pertama, kita bisa membuat HashMap<String, Vector<String>> untuk menyimpan suffix dari masing-masing string terlebih dahulu (baris 19). Setelah mengisi HashMap tersebut (baris 22-38), kita pun bisa langsung mencari preffix-nya sekaligus mem-print jawabannya sesuai dengan ketentuan dari problem (baris 39-46).
Seperti yang teman-teman lihat; disini, saya memakai fungsi next() (baris 21) untuk meng-input data string. Sebelumnya saya juga menggunakan hasNext() (baris 22) dikarenakan fungsi tersebut mampu meng-input data yang tidak diketahui jumlahnya. Fungsi tersebut sangat cocok jika dipakai untuk menangani input dengan format FASTA. Sedangkan untuk output-nya saya memakai fungsi out.println() (baris 43). Fungsi tersebut juga adalah modifikasi dari fungsi System.out.println() 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