package main
import (
"fmt"
)
type Kamus struct {
data map[string]map[string]bool
}
func NewKamus() *Kamus {
return &Kamus{
data: make(map[string]map[string]bool),
}
}
func (k *Kamus) Tambah(kata string, sinonim []string) {
if _, ok := k.data[kata]; !ok {
k.data[kata] = make(map[string]bool)
}
for _, s := range sinonim {
k.data[kata][s] = true
if _, ok := k.data[s]; !ok {
k.data[s] = make(map[string]bool)
}
k.data[s][kata] = true
}
}
func (k *Kamus) AmbilSinonim(kata string) []string {
visited := make(map[string]bool)
var result []string
var dfs func(string)
dfs = func(current string) {
for s := range k.data[current] {
if !visited[s] {
visited[s] = true
result = append(result, s)
dfs(s)
}
}
}
if _, ok := k.data[kata]; !ok {
return nil
}
dfs(kata)
return result
}
func main() {
kamus := NewKamus()
kamus.Tambah("big", []string{"large", "great"})
kamus.Tambah("big", []string{"huge", "fat"})
kamus.Tambah("huge", []string{"enormous", "gigantic"})
fmt.Println(kamus.AmbilSinonim("big"))
fmt.Println(kamus.AmbilSinonim("huge"))
fmt.Println(kamus.AmbilSinonim("gigantic"))
fmt.Println(kamus.AmbilSinonim("colossal"))
}
cGFja2FnZSBtYWluCgppbXBvcnQgKAoJImZtdCIKKQoKdHlwZSBLYW11cyBzdHJ1Y3QgewoJZGF0YSBtYXBbc3RyaW5nXW1hcFtzdHJpbmddYm9vbAp9CgpmdW5jIE5ld0thbXVzKCkgKkthbXVzIHsKCXJldHVybiAmS2FtdXN7CgkJZGF0YTogbWFrZShtYXBbc3RyaW5nXW1hcFtzdHJpbmddYm9vbCksCgl9Cn0KCmZ1bmMgKGsgKkthbXVzKSBUYW1iYWgoa2F0YSBzdHJpbmcsIHNpbm9uaW0gW11zdHJpbmcpIHsKCWlmIF8sIG9rIDo9IGsuZGF0YVtrYXRhXTsgIW9rIHsKCQlrLmRhdGFba2F0YV0gPSBtYWtlKG1hcFtzdHJpbmddYm9vbCkKCX0KCWZvciBfLCBzIDo9IHJhbmdlIHNpbm9uaW0gewoJCWsuZGF0YVtrYXRhXVtzXSA9IHRydWUKCQlpZiBfLCBvayA6PSBrLmRhdGFbc107ICFvayB7CgkJCWsuZGF0YVtzXSA9IG1ha2UobWFwW3N0cmluZ11ib29sKQoJCX0KCQlrLmRhdGFbc11ba2F0YV0gPSB0cnVlCgl9Cn0KCmZ1bmMgKGsgKkthbXVzKSBBbWJpbFNpbm9uaW0oa2F0YSBzdHJpbmcpIFtdc3RyaW5nIHsKCXZpc2l0ZWQgOj0gbWFrZShtYXBbc3RyaW5nXWJvb2wpCgl2YXIgcmVzdWx0IFtdc3RyaW5nCgl2YXIgZGZzIGZ1bmMoc3RyaW5nKQoJZGZzID0gZnVuYyhjdXJyZW50IHN0cmluZykgewoJCWZvciBzIDo9IHJhbmdlIGsuZGF0YVtjdXJyZW50XSB7CgkJCWlmICF2aXNpdGVkW3NdIHsKCQkJCXZpc2l0ZWRbc10gPSB0cnVlCgkJCQlyZXN1bHQgPSBhcHBlbmQocmVzdWx0LCBzKQoJCQkJZGZzKHMpCgkJCX0KCQl9Cgl9CglpZiBfLCBvayA6PSBrLmRhdGFba2F0YV07ICFvayB7CgkJcmV0dXJuIG5pbAoJfQoJZGZzKGthdGEpCglyZXR1cm4gcmVzdWx0Cn0KCmZ1bmMgbWFpbigpIHsKCWthbXVzIDo9IE5ld0thbXVzKCkKCWthbXVzLlRhbWJhaCgiYmlnIiwgW11zdHJpbmd7ImxhcmdlIiwgImdyZWF0In0pCglrYW11cy5UYW1iYWgoImJpZyIsIFtdc3RyaW5neyJodWdlIiwgImZhdCJ9KQoJa2FtdXMuVGFtYmFoKCJodWdlIiwgW11zdHJpbmd7ImVub3Jtb3VzIiwgImdpZ2FudGljIn0pCgoJZm10LlByaW50bG4oa2FtdXMuQW1iaWxTaW5vbmltKCJiaWciKSkKCWZtdC5QcmludGxuKGthbXVzLkFtYmlsU2lub25pbSgiaHVnZSIpKQoJZm10LlByaW50bG4oa2FtdXMuQW1iaWxTaW5vbmltKCJnaWdhbnRpYyIpKQoJZm10LlByaW50bG4oa2FtdXMuQW1iaWxTaW5vbmltKCJjb2xvc3NhbCIpKQp9Cg==