# class_kamus.py
from typing import List, Set, Dict, Optional
class Kamus:
"""
Class Kamus untuk menyimpan kata beserta sinonimnya.
Struktur data yang digunakan adalah dictionary of sets untuk efisiensi
dan penanganan data unik secara otomatis.
"""
def __init__(self):
"""
Inisialisasi kamus.
self._data akan menyimpan semua relasi sinonim.
Contoh: {'big': {'large', 'huge'}, 'large': {'big'}, 'huge': {'big'}}
"""
self._data: Dict[str, Set[str]] = {}
def tambah(self, kata: str, sinonim: List[str]) -> None:
"""
Menambahkan sebuah kata dan daftar sinonimnya ke dalam kamus.
Fungsi ini memastikan hubungan sinonim bersifat dua arah (simetris).
Args:
kata (str): Kata utama yang ingin ditambahkan.
sinonim (List[str]): Daftar sinonim dari kata utama.
"""
# 1. Pastikan kata utama ada di dalam kamus, jika tidak, buatkan set kosong.
# Metode setdefault melakukan ini dalam satu baris yang efisien.
self._data.setdefault(kata, set())
# 2. Tambahkan semua sinonim baru ke dalam set milik kata utama.
# `update` akan menambahkan semua item dari list, duplikat akan diabaikan oleh set.
self._data[kata].update(sinonim)
# 3. Buat hubungan sebaliknya. Untuk setiap sinonim, tambahkan 'kata' utama
# sebagai sinonim mereka.
for s in sinonim:
self._data.setdefault(s, set())
self._data[s].add(kata)
def ambilSinonim(self, kata: str) -> Optional[List[str]]:
"""
Mengambil semua sinonim dari sebuah kata yang ada di kamus.
Args:
kata (str): Kata yang sinonimnya ingin dicari.
Returns:
Optional[List[str]]: Sebuah list berisi sinonim jika kata ditemukan,
atau None jika kata tidak ditemukan.
"""
# 4. Gunakan .get() untuk mengambil data. Metode ini lebih aman karena
# akan mengembalikan None jika key tidak ada, tanpa menyebabkan error.
hasil_set = self._data.get(kata)
if hasil_set is not None:
# Ubah set menjadi list sebelum dikembalikan, sesuai permintaan soal.
return list(hasil_set)
# Jika kata tidak ditemukan sama sekali di kamus.
return None
# --- Pengujian Sesuai Contoh Soal ---
print("Memulai pengujian sesuai contoh soal...")
# Inisialisasi Kamus
kamus = Kamus()
print("Kamus dibuat.")
# Menambahkan data
kamus.tambah('big', ['large', 'great'])
print("kamus.tambah('big', ['large', 'great'])")
kamus.tambah('big', ['huge', 'fat'])
print("kamus.tambah('big', ['huge', 'fat'])")
kamus.tambah('huge', ['enormous', 'gigantic'])
print("kamus.tambah('huge', ['enormous', 'gigantic'])")
print("-" * 20)
# Test Case 1: Mengambil sinonim 'big'
# Harusnya menggabungkan dari dua kali penambahan
print(f"Hasil kamus.ambilSinonim('big'): {kamus.ambilSinonim('big')}")
# Expected: ['large', 'great', 'huge', 'fat'] (urutan bisa berbeda)
# Test Case 2: Mengambil sinonim 'huge'
# Perhatikan baik-baik hasil pengujian di bawah ini
print(f"Hasil kamus.ambilSinonim('huge'): {kamus.ambilSinonim('huge')}")
# Expected: ['enormous', 'gigantic', 'big'] (urutan bisa berbeda)
# Test Case 3: Mengambil sinonim 'gigantic'
# Ini menguji hubungan dua arah
print(f"Hasil kamus.ambilSinonim('gigantic'): {kamus.ambilSinonim('gigantic')}")
# Expected: ['huge']
# Test Case 4: Mengambil kata yang tidak ada
print(f"Hasil kamus.ambilSinonim('colossal'): {kamus.ambilSinonim('colossal')}")
# Expected: None