Upgrade to Pro — share decks privately, control downloads, hide ads and more …

Analisa Solusi dari Problem Jelix dan Semut Imu...

Analisa Solusi dari Problem Jelix dan Semut Imut di Final BNPCHS 2018

This slide is in Indonesian. To put it simply, we are trying to analyze a possible solution for the "Felix dan Semut Imut" problem that appeared in the BNPCHS 2018 competition.

Avatar for Wisnu Adi Nurcahyo

Wisnu Adi Nurcahyo

April 23, 2021
Tweet

More Decks by Wisnu Adi Nurcahyo

Other Decks in Programming

Transcript

  1. Proclub Dream. Think. Code. Win. Analisa Solusi dari Problem “Jelix

    dan Semut Imut” di Final BNPCHS 2018 April 23rd, 2021 Proclub Magang
  2. Garis Besar • Deskripsi Masalah • Analisa Solusi ◦ Decomposition

    ◦ Pattern Recognition ◦ Pattern Generalization ◦ Algorithm Design • Tanya-Jawab
  3. Deskripsi Masalah Dram. Think. Code. Win. Proclub • Jelix punya

    banyak semut imut. • Salah satu dari semut tersebut dapat berubah jadi semut mutan. • Semut mutan bakal makan semut-semut imut yang ada di depannya dan yang ada di belakangnya. • Semut mutan berhenti makan ketika semut di depannya memiliki ukuran tubuh yang sama atau lebih besar darinya.
  4. Ilustrasi Semutnya Jelix 3 5 3 Makan Bang Counter: 2

    4 yikes badannya lebih gede dari gw
  5. Artinya... Dari enam semut tadi, apabila semut kedua menjadi semut

    mutan, maka ia akan memakan sebanyak tiga semut imut. Nah, yang jadi pertanyaan, masing-masing semut kalo jadi semut mutan bakal makan berapa? Semut pertama bakal makan berapa? Semut kedua bakal makan berapa? Dan seterusnya sampai semut terakhir.
  6. Analisa Solusi Dram. Think. Code. Win. Proclub Berhubung kita udah

    paham maksud soalnya, kita bisa langsung coba cari solusinya. Untuk memudahkan pencarian solusi, kita coba pake pendekatan computational thinking. Adapun langkahnya yaitu: 1. Decomposition 2. Pattern recognition 3. Pattern generalization 4. Algorithm design
  7. Decomposition Fakta apa aja yang bisa kita ambil? • Semut

    mutan cuma makan semut imut yang ukurannya lebih kecil darinya.
  8. Decomposition Fakta apa aja yang bisa kita ambil? • Semut

    mutan cuma makan semut imut yang ukurannya lebih kecil darinya. • Semut mutan bisa makan semut imut yang ada di depannya juga yang ada di belakangnya.
  9. Decomposition Fakta apa aja yang bisa kita ambil? • Semut

    mutan cuma makan semut imut yang ukurannya lebih kecil darinya. • Semut mutan bisa makan semut imut yang ada di depannya juga yang ada di belakangnya. • Ada 10 kasus uji.
  10. Decomposition Fakta apa aja yang bisa kita ambil? • Semut

    mutan cuma makan semut imut yang ukurannya lebih kecil darinya. • Semut mutan bisa makan semut imut yang ada di depannya juga yang ada di belakangnya. • Ada 10 kasus uji. • Masing-masing kasus uji bisa ada 1 semut, 2 semut, atau bahkan 100 ribu semut di dalamnya.
  11. Decomposition Fakta apa aja yang bisa kita ambil? • Semut

    mutan cuma makan semut imut yang ukurannya lebih kecil darinya. • Semut mutan bisa makan semut imut yang ada di depannya juga yang ada di belakangnya. • Ada 10 kasus uji. • Masing-masing kasus uji bisa ada 1 semut, 2 semut, atau bahkan 100 ribu semut di dalamnya. • Cuma ada 1 semut mutan dalam satu waktu.
  12. Decomposition Fakta apa aja yang bisa kita ambil? • Semut

    mutan cuma makan semut imut yang ukurannya lebih kecil darinya. • Semut mutan bisa makan semut imut yang ada di depannya juga yang ada di belakangnya. • Ada 10 kasus uji. • Masing-masing kasus uji bisa ada 1 semut, 2 semut, atau bahkan 100 ribu semut di dalamnya. • Cuma ada 1 semut mutan dalam satu waktu. • Batas waktu 1 detik dan batas memory 64 MB.
  13. Anggap aja kita punya 6 semut imut dan ukurannya sebagai

    berikut. 3 4 1 1 5 3 Pattern Recognition
  14. Anggap aja kita punya 6 semut imut dan ukurannya sebagai

    berikut. 3 4 1 1 5 3 Patterns: • Semut pertama cuma bisa maju. Pattern Recognition
  15. Anggap aja kita punya 6 semut imut dan ukurannya sebagai

    berikut. 3 4 1 1 5 3 Patterns: • Semut pertama cuma bisa maju. • Semut terakhir cuma bisa mundur. Pattern Recognition
  16. Anggap aja kita punya 6 semut imut dan ukurannya sebagai

    berikut. 3 4 1 1 5 3 Patterns: • Semut pertama cuma bisa maju. • Semut terakhir cuma bisa mundur. • Selain itu, misal semut keempat, bisa maju dan bisa mundur. Pattern Recognition
  17. Terdapat 10 kasus uji. Masing-masing kasus uji memiliki (paling banyak)

    100 ribu semut. Artinya, data yang akan kita proses pada kasus terburuk adalah 10 x 10^5 = 1 juta semut imut. Hitung Kompleksitas Waktunya
  18. Pattern yang baru saja kita temukan, apabila kita menggunakan pendekatan

    brute-force sebagai solusi, maka waktu yang dibutuhkan adalah: O(T * N^2) = O(10 * (10^5)^2) = O(10^11) Berhubung rule of thumb-nya 1 detik = 10^8 maka solusi yang kita ajukan ini butuh waktu lebih dari 1 detik karena 10^11 jelas-jelas lebih dari 10^8. Hitung Kompleksitas Waktunya
  19. Darimana O(N^2) itu? Dari sini: 3 4 1 1 5

    3 Hitung Kompleksitas Waktunya
  20. Darimana O(N^2) itu? Dari sini: 3 4 1 1 5

    3 Mulai dari semut pertama. Hitung Kompleksitas Waktunya
  21. Darimana O(N^2) itu? Dari sini: 3 4 1 1 5

    3 Apakah semut di depannya lebih kecil ukurannya? Berhubung lebih besar, maka semut pertama tidak dapat memakan semut kedua lalu berhenti sampai di sini. Hitung Kompleksitas Waktunya
  22. Darimana O(N^2) itu? Dari sini: 3 4 1 1 5

    3 Sekarang mulai dari semut kedua. Hitung Kompleksitas Waktunya
  23. Darimana O(N^2) itu? Dari sini: 3 4 1 1 5

    3 Apakah semut kedua dapat memakan semut ketiga? Hitung Kompleksitas Waktunya
  24. Darimana O(N^2) itu? Dari sini: 3 4 1 1 5

    3 Apakah semut kedua dapat memakan semut keempat? Hitung Kompleksitas Waktunya
  25. Darimana O(N^2) itu? Dari sini: 3 4 1 1 5

    3 Apakah semut kedua dapat memakan semut kelima? Berhubung semut kelima ukurannya lebih besar, semut kedua balik arah. Hitung Kompleksitas Waktunya
  26. Darimana O(N^2) itu? Dari sini: 3 4 1 1 5

    3 Apakah semut kedua dapat memakan semut pertama? Hitung Kompleksitas Waktunya
  27. Darimana O(N^2) itu? Dari sini: 3 4 1 1 5

    3 Begitu seterusnya. Pengecekan seperti ini umumnya memiliki kasus terburuk N^2. Hitung Kompleksitas Waktunya
  28. Di dynamic programming (DP), terdapat teknik yang bernama memoization. Teknik

    ini intinya mengingat-ingat “jawaban yang sudah kita temukan sebelumnya”. Apa tuh? Menggunakan Dynamic Programming
  29. Apa yang diingat? Ini dia: 3 4 1 1 5

    3 Saat berjalan mundur, semut kedua dapat memakan semut pertama. Menggunakan Dynamic Programming
  30. Apa yang diingat? Ini dia: 3 4 1 1 5

    3 Lantas, apa yang terjadi kalau semut kelima memakan semut kedua saat berjalan mundur? Menggunakan Dynamic Programming
  31. Apa yang diingat? Ini dia: 3 4 1 1 5

    3 Lantas, apa yang terjadi kalau semut kelima memakan semut kedua saat berjalan mundur? 3 < 4 dan 4 < 5, artinya semut kelima juga secara otomatis dapat memakan semua semut yang dimakan oleh semut kedua apabila ia menjadi semut mutan. Menggunakan Dynamic Programming
  32. Anggap aja kita punya 6 semut imut dan ukurannya sebagai

    berikut. 3 4 1 1 5 3 Patterns: • Semut pertama cuma bisa maju. • Semut terakhir cuma bisa mundur. • Selain itu, misal semut keempat, bisa maju dan bisa mundur. Pattern Recognition
  33. Anggap aja kita punya 6 semut imut dan ukurannya sebagai

    berikut. 3 4 1 1 5 3 Patterns: • Semut pertama cuma bisa maju. • Semut terakhir cuma bisa mundur. • Selain itu, misal semut keempat, bisa maju dan bisa mundur. • Apabila semut mutan X dapat memakan suatu semut imut Y, maka semua semut imut yang dapat dimakan oleh Y ketika menjadi semut mutan juga dapat dimakan oleh X. Pattern Recognition
  34. Bagaimana formulasi solusinya? Berhubung semut mutan dapat berjalan maju dan

    mundur, kita dapat membuat tiga fungsi yaitu solve, forward, dan backward. solve(x) = forward(x) + backward(x) dimana x adalah posisi semut yang menjadi mutan. Pattern Generalization
  35. Adapun fungsi forward sebagai berikut: forward(x) = 1 + forward(x+1),

    jika ukuran semut x > semut x+1 forward(x) = 0, selainnya Pattern Generalization
  36. Adapun fungsi forward sebagai berikut: forward(x) = 1 + forward(x+1),

    jika ukuran semut x > semut x+1 forward(x) = 0, selainnya Apabila kita menggunakan memoization tadi, kita dapat membuat fungsi berikut: forward(x, w) = 1 + memo[x+1] + forward(x+1+memo[x+1], w) jika semut x+1 beratnya < w, dimana w adalah ukuran semut x forward(x, w) = 0, selainnya Pattern Generalization
  37. Untuk fungsi backward, mirip dengan forward, isinya sebagai berikut: backward(x)

    = 1 + backward(x-1), jika ukuran semut x > semut x-1 backward(x) = 0, selainnya Apabila kita menggunakan memoization tadi, kita dapat membuat fungsi berikut: backward(x, w) = 1 + memo[x-1] + backward(x-1-memo[x-1], w) jika semut x-1 beratnya < w, dimana w adalah ukuran semut x backward(x, w) = 0, selainnya Pattern Generalization
  38. So, hasil akhirnya seperti di bawah. solve(x, w) = forward(x,

    w) + backward(x, w) dimana x adalah posisi semut mutan dan w adalah ukuran tubuhnya. Pattern Generalization
  39. Sekarang, kita coba desain algoritmanya. Pertama-tama, ambil dulu nilai T

    yang mana berisi jumlah kasus uji. T = int(input()) Algorithm Design
  40. Sekarang, kita coba desain algoritmanya. Pertama-tama, ambil dulu nilai T

    yang mana berisi jumlah kasus uji. T = int(input()) Kemudian, untuk setiap kasus uji, ambil nilai N yang mana berisi jumlah semut-semut imut milik Jelix. for t in range(T): N = int(input()) Algorithm Design
  41. T = int(input()) for t in range(T): N = int(input())

    Buat dua buah variabel untuk memoization, misal left dan right. left = array of int, size N, default 0 right = array of int, size N, default 0 Sekarang, ambil semua semutnya. ants = [int(x) for x in input().split(‘ ‘)] Algorithm Design
  42. T = int(input()) for t in range(T): N = int(input())

    left = array of int, size N, default 0 right = array of int, size N, default 0 ants = [int(x) for x in input().split(‘ ‘)] Algorithm Design
  43. T = int(input()) for t in range(T): N = int(input())

    left = array of int, size N, default 0 right = array of int, size N, default 0 ants = [int(x) for x in input().split(‘ ‘)] Selanjutnya, cari tau dan inget-inget jawaban untuk forward dan backward. for x in range(N): w = ants[x] left = backward(x, w) right = forward(x, w) Algorithm Design
  44. T = int(input()) for t in range(T): N = int(input())

    left = array of int, size N, default 0 right = array of int, size N, default 0 ants = [int(x) for x in input().split(‘ ‘)] for x in range(N): w = ants[x] left = backward(x, w) right = forward(x, w) Algorithm Design
  45. T = int(input()) for t in range(T): N = int(input())

    left = array of int, size N, default 0 right = array of int, size N, default 0 ants = [int(x) for x in input().split(‘ ‘)] for x in range(N): w = ants[x] left = backward(x, w) right = forward(x, w) Terakhir, print solusinya. for x in range(N): answer = backward(x, ants[x]) + forward(x, ants[x]) print(answer, end=’ ‘) Algorithm Design
  46. T = int(input()) for t in range(T): N = int(input())

    left = array of int, size N, default 0 right = array of int, size N, default 0 ants = [int(x) for x in input().split(‘ ‘)] for x in range(N): w = ants[x] left = backward(x, w) right = forward(x, w) for x in range(N): answer = backward(x, ants[x]) + forward(x, ants[x]) print(answer, end=’ ‘) Algorithm Design