package main
import (
"fmt"
"sort"
)
type Kamus struct {
data map[string][]string
}
func NewKamus() *Kamus {
return &Kamus{
data: make(map[string][]string),
}
}
func (k *Kamus) Tambah(word string, synonyms []string) {
k.addUnique(word, word)
for _, syn := range synonyms {
k.addUnique(word, syn)
k.addUnique(syn, word)
}
}
func (k *Kamus) addUnique(word string, syn string) {
found := false
for _, existingSyn := range k.data[word] {
if existingSyn == syn {
found = true
break
}
}
if !found {
k.data[word] = append(k.data[word], syn)
}
}
func (k *Kamus) AmbilSinonim(word string) []string {
if _, ok := k.data[word]; !ok {
return nil
}
queue := []string{word}
visited := make(map[string]bool)
resultMap := make(map[string]bool)
visited[word] = true
resultMap[word] = true
for len(queue) > 0 {
currentWord := queue[0]
queue = queue[1:]
for _, syn := range k.data[currentWord] {
if !visited[syn] {
visited[syn] = true
resultMap[syn] = true
queue = append(queue, syn)
}
}
}
var synonyms []string
for syn := range resultMap {
synonyms = append(synonyms, syn)
}
sort.Strings(synonyms)
return synonyms
}
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"))
}
cGFja2FnZSBtYWluCgppbXBvcnQgKAoJImZtdCIKCSJzb3J0IgopCgp0eXBlIEthbXVzIHN0cnVjdCB7CglkYXRhIG1hcFtzdHJpbmddW11zdHJpbmcKfQoKZnVuYyBOZXdLYW11cygpICpLYW11cyB7CglyZXR1cm4gJkthbXVzewoJCWRhdGE6IG1ha2UobWFwW3N0cmluZ11bXXN0cmluZyksCgl9Cn0KCmZ1bmMgKGsgKkthbXVzKSBUYW1iYWgod29yZCBzdHJpbmcsIHN5bm9ueW1zIFtdc3RyaW5nKSB7CglrLmFkZFVuaXF1ZSh3b3JkLCB3b3JkKQoJZm9yIF8sIHN5biA6PSByYW5nZSBzeW5vbnltcyB7CgkJay5hZGRVbmlxdWUod29yZCwgc3luKQoJCWsuYWRkVW5pcXVlKHN5biwgd29yZCkKCX0KfQoKZnVuYyAoayAqS2FtdXMpIGFkZFVuaXF1ZSh3b3JkIHN0cmluZywgc3luIHN0cmluZykgewoJZm91bmQgOj0gZmFsc2UKCWZvciBfLCBleGlzdGluZ1N5biA6PSByYW5nZSBrLmRhdGFbd29yZF0gewoJCWlmIGV4aXN0aW5nU3luID09IHN5biB7CgkJCWZvdW5kID0gdHJ1ZQoJCQlicmVhawoJCX0KCX0KCWlmICFmb3VuZCB7CgkJay5kYXRhW3dvcmRdID0gYXBwZW5kKGsuZGF0YVt3b3JkXSwgc3luKQoJfQp9CgpmdW5jIChrICpLYW11cykgQW1iaWxTaW5vbmltKHdvcmQgc3RyaW5nKSBbXXN0cmluZyB7CglpZiBfLCBvayA6PSBrLmRhdGFbd29yZF07ICFvayB7CgkJcmV0dXJuIG5pbAoJfQoKCXF1ZXVlIDo9IFtdc3RyaW5ne3dvcmR9Cgl2aXNpdGVkIDo9IG1ha2UobWFwW3N0cmluZ11ib29sKQoJcmVzdWx0TWFwIDo9IG1ha2UobWFwW3N0cmluZ11ib29sKQoKCXZpc2l0ZWRbd29yZF0gPSB0cnVlCglyZXN1bHRNYXBbd29yZF0gPSB0cnVlCgoJZm9yIGxlbihxdWV1ZSkgPiAwIHsKCQljdXJyZW50V29yZCA6PSBxdWV1ZVswXQoJCXF1ZXVlID0gcXVldWVbMTpdCgoJCWZvciBfLCBzeW4gOj0gcmFuZ2Ugay5kYXRhW2N1cnJlbnRXb3JkXSB7CgkJCWlmICF2aXNpdGVkW3N5bl0gewoJCQkJdmlzaXRlZFtzeW5dID0gdHJ1ZQoJCQkJcmVzdWx0TWFwW3N5bl0gPSB0cnVlCgkJCQlxdWV1ZSA9IGFwcGVuZChxdWV1ZSwgc3luKQoJCQl9CgkJfQoJfQoKCXZhciBzeW5vbnltcyBbXXN0cmluZwoJZm9yIHN5biA6PSByYW5nZSByZXN1bHRNYXAgewoJCXN5bm9ueW1zID0gYXBwZW5kKHN5bm9ueW1zLCBzeW4pCgl9CgoJc29ydC5TdHJpbmdzKHN5bm9ueW1zKQoKCXJldHVybiBzeW5vbnltcwp9CgpmdW5jIG1haW4oKSB7CglrYW11cyA6PSBOZXdLYW11cygpCgoJa2FtdXMuVGFtYmFoKCJiaWciLCBbXXN0cmluZ3sibGFyZ2UiLCAiZ3JlYXQifSkKCWthbXVzLlRhbWJhaCgiYmlnIiwgW11zdHJpbmd7Imh1Z2UiLCAiZmF0In0pCglrYW11cy5UYW1iYWgoImh1Z2UiLCBbXXN0cmluZ3siZW5vcm1vdXMiLCAiZ2lnYW50aWMifSkKCglmbXQuUHJpbnRsbihrYW11cy5BbWJpbFNpbm9uaW0oImJpZyIpKQoJZm10LlByaW50bG4oa2FtdXMuQW1iaWxTaW5vbmltKCJodWdlIikpCglmbXQuUHJpbnRsbihrYW11cy5BbWJpbFNpbm9uaW0oImdpZ2FudGljIikpCglmbXQuUHJpbnRsbihrYW11cy5BbWJpbFNpbm9uaW0oImNvbG9zc2FsIikpCn0=