fork download
  1. # class_kamus.py
  2.  
  3. from typing import List, Set, Dict, Optional
  4.  
  5. class Kamus:
  6. """
  7. Class Kamus untuk menyimpan kata beserta sinonimnya.
  8. Struktur data yang digunakan adalah dictionary of sets untuk efisiensi
  9. dan penanganan data unik secara otomatis.
  10. """
  11.  
  12. def __init__(self):
  13. """
  14. Inisialisasi kamus.
  15. self._data akan menyimpan semua relasi sinonim.
  16. Contoh: {'big': {'large', 'huge'}, 'large': {'big'}, 'huge': {'big'}}
  17. """
  18. self._data: Dict[str, Set[str]] = {}
  19.  
  20. def tambah(self, kata: str, sinonim: List[str]) -> None:
  21. """
  22. Menambahkan sebuah kata dan daftar sinonimnya ke dalam kamus.
  23. Fungsi ini memastikan hubungan sinonim bersifat dua arah (simetris).
  24.  
  25. Args:
  26. kata (str): Kata utama yang ingin ditambahkan.
  27. sinonim (List[str]): Daftar sinonim dari kata utama.
  28. """
  29. # 1. Pastikan kata utama ada di dalam kamus, jika tidak, buatkan set kosong.
  30. # Metode setdefault melakukan ini dalam satu baris yang efisien.
  31. self._data.setdefault(kata, set())
  32.  
  33. # 2. Tambahkan semua sinonim baru ke dalam set milik kata utama.
  34. # `update` akan menambahkan semua item dari list, duplikat akan diabaikan oleh set.
  35. self._data[kata].update(sinonim)
  36.  
  37. # 3. Buat hubungan sebaliknya. Untuk setiap sinonim, tambahkan 'kata' utama
  38. # sebagai sinonim mereka.
  39. for s in sinonim:
  40. self._data.setdefault(s, set())
  41. self._data[s].add(kata)
  42.  
  43. def ambilSinonim(self, kata: str) -> Optional[List[str]]:
  44. """
  45. Mengambil semua sinonim dari sebuah kata yang ada di kamus.
  46.  
  47. Args:
  48. kata (str): Kata yang sinonimnya ingin dicari.
  49.  
  50. Returns:
  51. Optional[List[str]]: Sebuah list berisi sinonim jika kata ditemukan,
  52. atau None jika kata tidak ditemukan.
  53. """
  54. # 4. Gunakan .get() untuk mengambil data. Metode ini lebih aman karena
  55. # akan mengembalikan None jika key tidak ada, tanpa menyebabkan error.
  56. hasil_set = self._data.get(kata)
  57.  
  58. if hasil_set is not None:
  59. # Ubah set menjadi list sebelum dikembalikan, sesuai permintaan soal.
  60. return list(hasil_set)
  61.  
  62. # Jika kata tidak ditemukan sama sekali di kamus.
  63. return None
  64.  
  65. # --- Pengujian Sesuai Contoh Soal ---
  66. print("Memulai pengujian sesuai contoh soal...")
  67.  
  68. # Inisialisasi Kamus
  69. kamus = Kamus()
  70. print("Kamus dibuat.")
  71.  
  72. # Menambahkan data
  73. kamus.tambah('big', ['large', 'great'])
  74. print("kamus.tambah('big', ['large', 'great'])")
  75.  
  76. kamus.tambah('big', ['huge', 'fat'])
  77. print("kamus.tambah('big', ['huge', 'fat'])")
  78.  
  79. kamus.tambah('huge', ['enormous', 'gigantic'])
  80. print("kamus.tambah('huge', ['enormous', 'gigantic'])")
  81. print("-" * 20)
  82.  
  83.  
  84. # Test Case 1: Mengambil sinonim 'big'
  85. # Harusnya menggabungkan dari dua kali penambahan
  86. print(f"Hasil kamus.ambilSinonim('big'): {kamus.ambilSinonim('big')}")
  87. # Expected: ['large', 'great', 'huge', 'fat'] (urutan bisa berbeda)
  88.  
  89. # Test Case 2: Mengambil sinonim 'huge'
  90. # Perhatikan baik-baik hasil pengujian di bawah ini
  91. print(f"Hasil kamus.ambilSinonim('huge'): {kamus.ambilSinonim('huge')}")
  92. # Expected: ['enormous', 'gigantic', 'big'] (urutan bisa berbeda)
  93.  
  94. # Test Case 3: Mengambil sinonim 'gigantic'
  95. # Ini menguji hubungan dua arah
  96. print(f"Hasil kamus.ambilSinonim('gigantic'): {kamus.ambilSinonim('gigantic')}")
  97. # Expected: ['huge']
  98.  
  99. # Test Case 4: Mengambil kata yang tidak ada
  100. print(f"Hasil kamus.ambilSinonim('colossal'): {kamus.ambilSinonim('colossal')}")
  101. # Expected: None
Success #stdin #stdout 0.17s 16608KB
stdin
Standard input is empty
stdout
Memulai pengujian sesuai contoh soal...
Kamus dibuat.
kamus.tambah('big', ['large', 'great'])
kamus.tambah('big', ['huge', 'fat'])
kamus.tambah('huge', ['enormous', 'gigantic'])
--------------------
Hasil kamus.ambilSinonim('big'): ['large', 'huge', 'great', 'fat']
Hasil kamus.ambilSinonim('huge'): ['big', 'enormous', 'gigantic']
Hasil kamus.ambilSinonim('gigantic'): ['huge']
Hasil kamus.ambilSinonim('colossal'): None