Contoh Soal Algoritma Populer Lengkap dengan Bahasan Step by Step

Berbicara mengenai dunia pemrograman dan pengembangan perangkat lunak, algoritma merupakan fondasi utama yang harus dikuasai oleh setiap pengembang. Algoritma bukan sekadar baris kode, melainkan logika sistematis untuk memecahkan suatu masalah. Pemahaman yang mendalam tentang algoritma akan membantu Anda menulis kode yang lebih efisien, hemat memori, dan memiliki performa yang optimal.

Artikel ini dirancang sebagai panduan komprehensif untuk membantu Anda memahami konsep algoritma populer melalui contoh soal dan pembahasan langkah demi langkah. Kita akan membahas berbagai kategori algoritma, mulai dari pengurutan (sorting), pencarian (searching), hingga algoritma rekursif yang sering muncul dalam wawancara kerja di perusahaan teknologi besar.

Baca juga: Pentingnya Menguasai Administrasi Kesehatan

Urgensi Mempelajari Algoritma dalam Pemrograman

Sebelum masuk ke contoh soal, penting untuk memahami mengapa algoritma sangat krusial. Dalam skala data yang kecil, perbedaan antara algoritma yang efisien dan tidak mungkin tidak terasa. Namun, ketika berhadapan dengan jutaan data (Big Data), algoritma yang buruk dapat menyebabkan sistem mengalami crash atau berjalan sangat lambat.

Pengukuran efisiensi algoritma biasanya menggunakan Notasi Big O. Notasi ini memberikan gambaran tentang bagaimana waktu eksekusi atau penggunaan memori tumbuh seiring bertambahnya jumlah data input.

🔖 Baca juga:
Penyebab Tubuh Pegal: Dari Aktivitas Harian hingga Kondisi Medis

Algoritma Pengurutan (Sorting Algorithms)

Sorting adalah salah satu masalah klasik dalam ilmu komputer. Tujuannya adalah menyusun elemen dalam urutan tertentu, biasanya dari terkecil ke terbesar (ascending) atau sebaliknya (descending).

1. Bubble Sort

Bubble Sort adalah algoritma pengurutan yang paling sederhana. Cara kerjanya adalah dengan membandingkan dua elemen yang berdekatan dan menukarnya jika urutannya salah. Proses ini diulang sampai seluruh daftar terurut.

Contoh Soal:

Urutkan array berikut menggunakan Bubble Sort: [5, 2, 9, 1, 5]

Pembahasan Step by Step:

  • Iterasi 1:
    • Bandingkan 5 dan 2. Karena 5 > 2, tukar posisi. Array: [2, 5, 9, 1, 5]
    • Bandingkan 5 dan 9. Karena 5 < 9, tetap. Array: [2, 5, 9, 1, 5]
    • Bandingkan 9 dan 1. Karena 9 > 1, tukar posisi. Array: [2, 5, 1, 9, 5]
    • Bandingkan 9 dan 5. Karena 9 > 5, tukar posisi. Array: [2, 5, 1, 5, 9]
    • Elemen terbesar (9) kini berada di posisi akhir.
  • Iterasi 2:
    • Bandingkan 2 dan 5. Tetap.
    • Bandingkan 5 dan 1. Tukar. Array: [2, 1, 5, 5, 9]
    • Bandingkan 5 dan 5. Tetap.
    • Elemen 5 kedua sudah di posisi yang benar.
  • Iterasi 3:
    • Bandingkan 2 dan 1. Tukar. Array: [1, 2, 5, 5, 9]
    • Bandingkan 2 dan 5. Tetap.
  • Hasil Akhir: [1, 2, 5, 5, 9]

Meskipun mudah dipahami, Bubble Sort memiliki kompleksitas waktu $O(n^2)$, sehingga tidak direkomendasikan untuk dataset besar.

2. Quick Sort

Quick Sort menggunakan pendekatan “Divide and Conquer” (bagi dan kuasai). Algoritma ini memilih satu elemen sebagai “pivot” dan mempartisi array sedemikian rupa sehingga elemen yang lebih kecil dari pivot berada di sebelah kiri, dan yang lebih besar di sebelah kanan.

Contoh Soal:

Urutkan array [10, 80, 30, 90, 40] menggunakan Quick Sort dengan pivot elemen terakhir.

Pembahasan Step by Step:

  • Langkah 1 (Pilih Pivot): Pivot adalah 40.
  • Langkah 2 (Partisi):
    • Bandingkan 10 dengan 40. 10 < 40, posisi tetap.
    • Bandingkan 80 dengan 40. 80 > 40, abaikan.
    • Bandingkan 30 dengan 40. 30 < 40, tukar posisi dengan elemen yang lebih besar sebelumnya (80). Array menjadi: [10, 30, 80, 90, 40]
    • Terakhir, tukar pivot (40) ke posisi yang tepat. Array: [10, 30, 40, 90, 80]
  • Langkah 3 (Rekursi): Terapkan proses yang sama pada sub-array kiri [10, 30] dan sub-array kanan [90, 80].
  • Hasil Akhir: [10, 30, 40, 80, 90]

Quick Sort memiliki rata-rata kompleksitas $O(n \log n)$, menjadikannya salah satu algoritma tercepat untuk penggunaan umum.

Algoritma Pencarian (Searching Algorithms)

Setelah data terurut, seringkali kita perlu mencari nilai spesifik di dalamnya.

1. Binary Search

Binary Search adalah algoritma pencarian yang sangat efisien, namun syarat mutlaknya adalah data harus sudah dalam keadaan terurut. Algoritma ini bekerja dengan membagi rentang pencarian menjadi dua terus menerus.

Contoh Soal:

Cari angka 23 dalam array terurut: [2, 5, 8, 12, 16, 23, 38, 56, 72, 91]

Pembahasan Step by Step:

  • Langkah 1: Tentukan indeks awal (low = 0) dan akhir (high = 9). Hitung nilai tengah (mid).
    • $mid = (0 + 9) / 2 = 4$ (indeks ke-4 adalah 16).
  • Langkah 2: Bandingkan target (23) dengan nilai mid (16).
    • Karena 23 > 16, kita hanya perlu mencari di sisi kanan.
    • Update low menjadi $mid + 1 = 5$.
  • Langkah 3: Hitung kembali nilai tengah.
    • $mid = (5 + 9) / 2 = 7$ (indeks ke-7 adalah 56).
  • Langkah 4: Bandingkan 23 dengan 56.
    • Karena 23 < 56, kita cari di sisi kiri dari rentang baru ini.
    • Update high menjadi $mid – 1 = 6$.
  • Langkah 5: Hitung kembali nilai tengah.
    • $mid = (5 + 6) / 2 = 5$ (indeks ke-5 adalah 23).
  • Langkah 6: 23 ditemukan pada indeks ke-5.

Kompleksitas Binary Search adalah $O(\log n)$, yang jauh lebih cepat daripada Linear Search $O(n)$ untuk data skala besar.

Algoritma Jalur Terpendek (Shortest Path Algorithms)

Dalam navigasi GPS atau desain jaringan, menemukan rute terpendek adalah hal mendasar.

1. Algoritma Dijkstra

Dijkstra digunakan untuk menemukan jalur terpendek dari satu titik (node) ke semua titik lainnya dalam sebuah graf berbobot positif.

Contoh Kasus:

Diberikan graf dengan titik A, B, C, D. Jarak A-B=4, A-C=2, C-B=1, B-D=5, C-D=8. Cari jalur terpendek dari A ke D.

Pembahasan Step by Step:

  • Inisialisasi: Jarak A=0, lainnya tak terhingga ($\infty$).
  • Langkah 1: Dari A, titik terdekat adalah C (jarak 2).
    • Jarak ke B lewat C adalah $2 + 1 = 3$. Ini lebih kecil dari jarak langsung A-B (4). Update jarak B menjadi 3.
  • Langkah 2: Dari C, periksa ke D. Jarak $2 + 8 = 10$.
  • Langkah 3: Sekarang pilih titik dengan jarak terkecil yang belum dikunjungi, yaitu B (jarak 3).
    • Periksa B ke D: $3 + 5 = 8$. Ini lebih kecil dari jarak sebelumnya (10). Update jarak D menjadi 8.
  • Langkah 4: Titik D tercapai dengan jarak minimum 8 melalui jalur A -> C -> B -> D.

Algoritma Pemrograman Dinamis (Dynamic Programming)

Dynamic Programming (DP) adalah teknik memecahkan masalah kompleks dengan membaginya menjadi sub-masalah yang lebih sederhana dan menyimpan hasilnya agar tidak perlu dihitung ulang.

1. Deret Fibonacci dengan Memoization

Deret Fibonacci adalah urutan angka di mana setiap angka adalah jumlah dari dua angka sebelumnya: 0, 1, 1, 2, 3, 5, 8, 13…

Contoh Soal:

Hitung angka Fibonacci ke-6 menggunakan Dynamic Programming.

Pembahasan Step by Step:

  • Tanpa DP, kita melakukan banyak perhitungan berulang. Misalnya untuk menghitung $F(6)$, kita butuh $F(5)$ dan $F(4)$. Untuk $F(5)$ kita butuh $F(4)$ lagi. Di sini $F(4)$ dihitung dua kali.
  • Dengan DP (Memoization):
    1. Simpan $F(0)=0$ dan $F(1)=1$ dalam tabel/array.
    2. Hitung $F(2) = 0 + 1 = 1$. Simpan.
    3. Hitung $F(3) = 1 + 1 = 2$. Simpan.
    4. Hitung $F(4) = 2 + 1 = 3$. Simpan.
    5. Hitung $F(5) = 3 + 2 = 5$. Simpan.
    6. Hitung $F(6) = 5 + 3 = 8$.
  • Hasilnya adalah 8 dengan efisiensi waktu linear $O(n)$ dibandingkan rekursif biasa yang $O(2^n)$.

Struktur Data Pendukung Algoritma

Algoritma tidak bisa berdiri sendiri tanpa struktur data yang tepat. Pemilihan struktur data yang salah dapat menghambat performa algoritma.

  • Array: Efektif untuk akses data cepat melalui indeks, tetapi lambat dalam penyisipan (insertion) di tengah.
  • Linked List: Sangat fleksibel untuk manipulasi elemen, namun lambat untuk pencarian karena harus ditelusuri satu per satu.
  • Hash Table: Menyediakan waktu akses rata-rata $O(1)$, sangat cocok untuk sistem caching dan database mapping.
  • Stack dan Queue: Penting untuk algoritma seperti BFS (Breadth-First Search) dan DFS (Depth-First Search).

Tips Menguasai Algoritma untuk Pemula

Menguasai algoritma membutuhkan latihan yang konsisten. Berikut adalah beberapa tips yang dapat Anda terapkan:

  1. Jangan Langsung Coding: Sebelum menulis kode, gunakan kertas dan pulpen. Gambar alur logika atau flowchart-nya terlebih dahulu.
  2. Pahami Konsep, Bukan Hafalan: Jangan menghafal baris kode algoritma. Pahamilah mengapa suatu langkah diambil dan bagaimana dampaknya terhadap efisiensi.
  3. Latihan di Platform Online: Manfaatkan platform seperti LeetCode, HackerRank, atau CodeWars. Mulailah dari level “Easy” sebelum naik ke tingkat yang lebih sulit.
  4. Analisis Big O: Biasakan untuk selalu menganalisis kompleksitas waktu dan ruang dari kode yang Anda tulis.
  5. Bedah Kode Orang Lain: Lihat bagaimana pengembang senior memecahkan masalah yang sama. Seringkali ada trik-trik optimasi yang tidak terpikirkan sebelumnya.

Baca juga: Rektor Universitas Teknokrat Indonesia Salurkan Donasi untuk Korban Bencana Sumatera melalui ICMI

Kesimpulan

Algoritma adalah jantung dari teknologi. Dari pengurutan data sederhana hingga penentuan rute logistik yang kompleks, semuanya bergantung pada efisiensi algoritma yang digunakan. Dengan memahami contoh-contoh di atas, Anda telah memiliki fondasi untuk mempelajari konsep yang lebih rumit seperti Machine Learning atau Kriptografi.

Teruslah bereksperimen dengan berbagai variasi soal. Ingatlah bahwa tidak ada algoritma yang sempurna untuk semua situasi. Tugas seorang pengembang adalah memilih algoritma yang paling sesuai dengan kendala dan kebutuhan spesifik dari masalah yang sedang dihadapi.

Penulis: Aripin

Post Comment