using System;
public class Kamus
{
private Dictionary<string, HashSet<string>> data = new Dictionary<string, HashSet<string>>();
public void tambah(string kata, string[] sinonim)
{
if (!data.ContainsKey(kata))
{
data[kata] = new HashSet<string>();
}
foreach (var s in sinonim)
{
data[kata].Add(s);
}
}
public string[] ambilSinonim(string kata)
{
if (!data.ContainsKey(kata))
{
// cari apakah kata ini sinonim dari kata lain
foreach (var entry in data)
{
if (entry.Value.Contains(kata))
{
return new List<string> { entry.Key }.Concat(data.ContainsKey(entry.Key) ? data[entry.Key] : new HashSet<string>())
.Where(w => w != kata)
.ToArray();
}
}
return null; // tidak ditemukan
}
return data[kata].ToArray();
}
}
public class Test
{
public static void Main()
{
Kamus kamus = new Kamus();
kamus.tambah("big", new string[] { "large", "great" });
kamus.tambah("big", new string[] { "huge", "fat" });
kamus.tambah("huge", new string[] { "enormous", "gigantic" });
Console.WriteLine("Sinonim 'big': " + string.Join(", ", kamus.ambilSinonim("big") ?? new string[] { "null" }));
Console.WriteLine("Sinonim 'huge': " + string.Join(", ", kamus.ambilSinonim("huge") ?? new string[] { "null" }));
Console.WriteLine("Sinonim 'gigantic': " + string.Join(", ", kamus.ambilSinonim("gigantic") ?? new string[] { "null" }));
Console.WriteLine("Sinonim 'colossal': " + string.Join(", ", kamus.ambilSinonim("colossal") ?? new string[] { "null" }));
}
}
dXNpbmcgU3lzdGVtOwoKcHVibGljIGNsYXNzIEthbXVzCnsKCXByaXZhdGUgRGljdGlvbmFyeTxzdHJpbmcsIEhhc2hTZXQ8c3RyaW5nPj4gZGF0YSA9IG5ldyBEaWN0aW9uYXJ5PHN0cmluZywgSGFzaFNldDxzdHJpbmc+PigpOwoKCSBwdWJsaWMgdm9pZCB0YW1iYWgoc3RyaW5nIGthdGEsIHN0cmluZ1tdIHNpbm9uaW0pCgkgewoJICAgICBpZiAoIWRhdGEuQ29udGFpbnNLZXkoa2F0YSkpCgkgICAgIHsKCSAgICAgICAgIGRhdGFba2F0YV0gPSBuZXcgSGFzaFNldDxzdHJpbmc+KCk7CgkgICAgIH0KCQoJICAgICBmb3JlYWNoICh2YXIgcyBpbiBzaW5vbmltKQoJICAgICB7CgkgICAgICAgICBkYXRhW2thdGFdLkFkZChzKTsKCSAgICAgfQoJIH0KCgkgcHVibGljIHN0cmluZ1tdIGFtYmlsU2lub25pbShzdHJpbmcga2F0YSkKCSB7CgkgICAgIGlmICghZGF0YS5Db250YWluc0tleShrYXRhKSkKCSAgICAgewoJICAgICAgICAgLy8gY2FyaSBhcGFrYWgga2F0YSBpbmkgc2lub25pbSBkYXJpIGthdGEgbGFpbgoJICAgICAgICAgZm9yZWFjaCAodmFyIGVudHJ5IGluIGRhdGEpCgkgICAgICAgICB7CgkgICAgICAgICAgICAgaWYgKGVudHJ5LlZhbHVlLkNvbnRhaW5zKGthdGEpKQoJICAgICAgICAgICAgIHsKCSAgICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBMaXN0PHN0cmluZz4geyBlbnRyeS5LZXkgfS5Db25jYXQoZGF0YS5Db250YWluc0tleShlbnRyeS5LZXkpID8gZGF0YVtlbnRyeS5LZXldIDogbmV3IEhhc2hTZXQ8c3RyaW5nPigpKQoJICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5XaGVyZSh3ID0+IHcgIT0ga2F0YSkKCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuVG9BcnJheSgpOwoJICAgICAgICAgICAgIH0KCSAgICAgICAgIH0KCSAgICAgICAgIHJldHVybiBudWxsOyAvLyB0aWRhayBkaXRlbXVrYW4KCSAgICAgfQoJCgkgICAgIHJldHVybiBkYXRhW2thdGFdLlRvQXJyYXkoKTsKCSB9Cn0KCnB1YmxpYyBjbGFzcyBUZXN0CnsKCXB1YmxpYyBzdGF0aWMgdm9pZCBNYWluKCkKCXsKCQlLYW11cyBrYW11cyA9IG5ldyBLYW11cygpOwoJCWthbXVzLnRhbWJhaCgiYmlnIiwgbmV3IHN0cmluZ1tdIHsgImxhcmdlIiwgImdyZWF0IiB9KTsKCQlrYW11cy50YW1iYWgoImJpZyIsIG5ldyBzdHJpbmdbXSB7ICJodWdlIiwgImZhdCIgfSk7CgkJa2FtdXMudGFtYmFoKCJodWdlIiwgbmV3IHN0cmluZ1tdIHsgImVub3Jtb3VzIiwgImdpZ2FudGljIiB9KTsKCQkKCQlDb25zb2xlLldyaXRlTGluZSgiU2lub25pbSAnYmlnJzogIiArIHN0cmluZy5Kb2luKCIsICIsIGthbXVzLmFtYmlsU2lub25pbSgiYmlnIikgPz8gbmV3IHN0cmluZ1tdIHsgIm51bGwiIH0pKTsKCQlDb25zb2xlLldyaXRlTGluZSgiU2lub25pbSAnaHVnZSc6ICIgKyBzdHJpbmcuSm9pbigiLCAiLCBrYW11cy5hbWJpbFNpbm9uaW0oImh1Z2UiKSA/PyBuZXcgc3RyaW5nW10geyAibnVsbCIgfSkpOwoJCUNvbnNvbGUuV3JpdGVMaW5lKCJTaW5vbmltICdnaWdhbnRpYyc6ICIgKyBzdHJpbmcuSm9pbigiLCAiLCBrYW11cy5hbWJpbFNpbm9uaW0oImdpZ2FudGljIikgPz8gbmV3IHN0cmluZ1tdIHsgIm51bGwiIH0pKTsKCQlDb25zb2xlLldyaXRlTGluZSgiU2lub25pbSAnY29sb3NzYWwnOiAiICsgc3RyaW5nLkpvaW4oIiwgIiwga2FtdXMuYW1iaWxTaW5vbmltKCJjb2xvc3NhbCIpID8/IG5ldyBzdHJpbmdbXSB7ICJudWxsIiB9KSk7Cgl9Cn0K