Pahami permasalahan sebelum memecahkan
Tags: indonesia, algoritma
Published: 2021-11-16 13:03:09

Jadi saya sedang mencoba untuk rutin latihan problem solving menggunakan platform Hackerrank. Kemarin saya sampai di soal [Tower Breakers](https://www.hackerrank.com/challenges/one-week-preparation-kit-tower-breakers-1/problem). Soal ini tentang menentukan siapakah diantara 2 pemain yang akan menang. Peraturan permainan adalah di satu sesi permainan akan disediakan `n` Tower yang tersusun dari sejumlah `m` blok. kedua pemain ini akan secara bergantian mengurangi jumlah blok di Tower dengan persyaratan jumlah blok yang baru adalah pembagi habis jumlah blok saat ini (sisa pembagian 0). Pemain akan menang jika bisa membuat pemain lain tidak bisa mengurangi ketinggian Tower.

Saya latihan dengan cara coba mengerjakan soal tersebut selama 15 menit, jika masih buntu ide, saya akan coba melihat kolom diskusi. Dalam 15 menit saya dipusingkan dengan bagaimana mensimulasikan langkah setiap pemain (menggunakan looping `for` atau `while`). Saat waktu 15 menit hampir habis, saya mencoba bereksperimen bagaimana kalau sebenarnya jawabannya tidak perlu `looping` ? jadi saya coba jika `n * m % 2 == 0` maka player 2 yang menang selain itu player 1 yang menang.

```c++
int towerBreakers(int n, int m) {
  if (n * m % 2 == 0) {
    return 2;
  }
  return 1;
}
```
Dan ternyata belum benar. Akhirnya saya menyerah dan coba lihat di kolom diskusi. Menurut saya ini adalah contoh kontribusi di forum diskusi yang baik. Ketimbang kita hanya membagikan kode kita, akan lebih berguna jika kita menjelaskan pendekatan logika kita ketika memecahkan masalah ini.

![Hackerrank Discussion](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/e0tvz5ftgorjckentczn.png)

Setelah itu saya baru sadar, saya mesti memahami dulu apa yang akan dilakukan oleh setiap pemain untuk menang. Disini ada beberapa macam kasus yang bisa memastikan player mana yang menang.

**Case 1** : misalkan hanya ada 1 Tower dan jumlah bloknya lebih dari 1, karena di peraturan pasti player 1 yang akan jalan duluan, jika saya jadi player 1 saya akan langsung membuat tinggi Tower menjadi 1 blok karena ini memastikan saya akan menang (m % 1 pasti 0).
**Case 2** : misalkan jumlah Tower adalah bilangan genap. Ini sudah bisa dipastikan player 2 yang akan menang, karena dia akan meng-copy setiap langkah dari player 1 sampai player 1 tidak bisa jalan. Jika tower ganjil berarti itu kembali ke case 1 karena tidak ada gunanya player 2 menyalin langkah player 1.

Berdasarkan case diatas code penyelesaiannya kurang lebih seperti ini.

```c++
int towerBreakers(int n, int m) {
  if (n % 2 == 0) {
    return 2;
  }
  return 1;
}
```

Setelah saya coba submit ternyata ada case lain yang belum coba kita bayangkan, yaitu case dimana jumlah blok di setiap tower hanya 1. Jika case-nya adalah itu sudah pasti player 2 akan menang karena player 1 langsung tidak bisa jalan di giliran pertama.

![another case](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/50d7yu0myvy866u2sbr5.png)

Setelah memasukkan case terakhir, akhirnya code kita melewati semua test case yang ada.

```c++
int towerBreakers(int n, int m) {
  if (n % 2 == 0 || m == 1) {
    return 2;
  }
  return 1;
}
```

Dari sini saya belajar kalau kita sebagai programmer tidak hanya sekedar coding saja, tapi kita perlu fokus ke pemecahan masalahnya.

Credit:
- Cover image: Photo by <a href="https://unsplash.com/@olav_ahrens?utm_source=unsplash&utm_medium=referral&utm_content=creditCopyText">Olav Ahrens Røtne</a> on <a href="https://unsplash.com/s/photos/problem-solving?utm_source=unsplash&utm_medium=referral&utm_content=creditCopyText">Unsplash</a>