Jumat, 16 Januari 2009

PalindromeTest

Pertama kalinya ikutan interview kerja, eh malah disuruh 'ngoding'. Ngodingnya diatas kertas pakai pinsil pinjaman dari 'saingan' yg kebetulan teman saya sendiri yg katanya lagi nyari suasana baru(baca: fed up with his current job). Sebenarnya sehari sebelumnya udah dapat bocoran dari teman lainnya kalo interviewnya emang bakal didahului dengan tes logika, ya 'ngoding' itu.

Problemnya sederhana, cuma disuruh buat prosedur untuk menentukan apakah sebuah kata adalah palindrome atau bukan. Buat yang belum tau, gampangnya palindrome adalah string(deretan karakter) yang memiliki properti kalau string tersebut dipotong pas ditengah-tengah, setiap karakter dari paruh pertama punya pasangan simetri(cermin) dengan paruh keduanya. Contoh palindrome: nababan, abba, xxx dan tamat.

Untuk sarjana komputer seperti teman saya dan calon sarjana komputer seperti saya, problem ini tidak terlalu sulit. Ditambah lagi tesnya ndak ada yang ngawasi. Akhirnya kami kerjakan secara gotong-royong dengan musyawarah mufakat seperti:

R: "Zi, pake charAt ya?"
F: "Iya"
F: "Oiya, ini ada kasus ganjil genap?"
R: "Gampang, pake ip aje, ip"

Alhasil, 'program' akhir teman saya lebih pendek. Kok? Ya soalnya dia hanya bikin sebuah prosedur saja. Memang itu sih perintah disoalnya. Sedangkan saya, hampir 1,5 halaman. Soalnya mbak-mbak yg ngasih soal bilang: "Selesaikan dengan bahasa pemrograman yang paling Anda kuasai!". Yaudah saya buatlah satu kelas Java komplit dengan segala kurung kurawalnya(benar salahnya ga tau ya:) tapi kayaknya mostly bener deh).

Karena penasaran begitu sampai kos langsung buka notebook, ga sampe 5 menit, jadilah ini(dalam Java):

  1. class PalindromeTest
  2. {
  3. public static void main(String[] args)
  4. {
  5. String kata = "KATAK";
  6. int panjang = kata.length();

  7. boolean genap = ((panjang % 2) == 0);

  8. int paruh = panjang / 2;
  9. int kiri = 0, kanan = panjang - 1;

  10. if (genap)
  11. {
  12. while (kiri < paruh)
  13. {
  14. if (kata.charAt(kiri) == kata.charAt(kanan))
  15. {
  16. if(kiri == paruh - 1)
  17. {
  18. System.out.println(kata + " adalah palindrome");
  19. break;
  20. }

  21. kanan--;
  22. kiri++;
  23. }
  24. else
  25. {
  26. System.out.println(kata + " bukan palindrome");
  27. break;
  28. }
  29. }
  30. }
  31. else
  32. {
  33. while (kiri <= paruh)
  34. {
  35. if (kata.charAt(kiri) == kata.charAt(kanan))
  36. {
  37. if(kiri == paruh)
  38. {
  39. System.out.println(kata + " adalah palindrome");
  40. break;
  41. }

  42. kanan--;
  43. kiri++;
  44. }
  45. else
  46. {
  47. System.out.println(kata + " bukan palindrome");
  48. break;
  49. }
  50. }
  51. }
  52. }
  53. }

Inti dari program ini:
  • Tentukan dulu apakah panjang string genap atau ganjil(baris 8 dan 13)
  • Perhatikan perbedaan sentinel antara string panjang ganjil dan genap(baris 15 dan 37)
  • Bandingkan setiap karakter dengan karakter simetrinya(baris 17 dan 39)
  • Increment dan decrement indeks paruh kiri dan paruh kanan pada setiap iterasi(baris 25,26 dan 47,48)


Waktu tes sempat kepikiran pake method buat nge-reverse string-nya, kan bisa lebih simpel tuh. Tapi karena waktu itu ga tau library StringBuffer-nya, ya udah cara 'bego' aja.

Semoga bermanfaat;

2 komentar:

joolean mengatakan...

now you can think about how to find longest palindrome possible from a given string. ex:

dabcbaff --> abcba
jefej --> jefej
fghcc123 --> cc
gugup --> gug atau ugu

selamat mencoba =)

fahrurrozi-rahman mengatakan...

eh baru nyadar ada ini...
identitas yang satu lagi dibuka pula, walaupun cuma inisial...

ckckckck

~saingan nih yeee