fork download
  1. package main
  2.  
  3. import (
  4. "fmt"
  5. )
  6.  
  7. type Kamus struct {
  8. data map[string]map[string]bool
  9. }
  10.  
  11. func NewKamus() *Kamus {
  12. return &Kamus{
  13. data: make(map[string]map[string]bool),
  14. }
  15. }
  16.  
  17. func (k *Kamus) Tambah(kata string, sinonim []string) {
  18. if _, ok := k.data[kata]; !ok {
  19. k.data[kata] = make(map[string]bool)
  20. }
  21. for _, s := range sinonim {
  22. k.data[kata][s] = true
  23. if _, ok := k.data[s]; !ok {
  24. k.data[s] = make(map[string]bool)
  25. }
  26. k.data[s][kata] = true
  27. }
  28. }
  29.  
  30. func (k *Kamus) AmbilSinonim(kata string) []string {
  31. visited := make(map[string]bool)
  32. var result []string
  33. var dfs func(string)
  34. dfs = func(current string) {
  35. for s := range k.data[current] {
  36. if !visited[s] {
  37. visited[s] = true
  38. result = append(result, s)
  39. dfs(s)
  40. }
  41. }
  42. }
  43. if _, ok := k.data[kata]; !ok {
  44. return nil
  45. }
  46. dfs(kata)
  47. return result
  48. }
  49.  
  50. func main() {
  51. kamus := NewKamus()
  52. kamus.Tambah("big", []string{"large", "great"})
  53. kamus.Tambah("big", []string{"huge", "fat"})
  54. kamus.Tambah("huge", []string{"enormous", "gigantic"})
  55.  
  56. fmt.Println(kamus.AmbilSinonim("big"))
  57. fmt.Println(kamus.AmbilSinonim("huge"))
  58. fmt.Println(kamus.AmbilSinonim("gigantic"))
  59. fmt.Println(kamus.AmbilSinonim("colossal"))
  60. }
  61.  
Success #stdin #stdout 0s 5316KB
stdin
Standard input is empty
stdout
[large big great huge enormous gigantic fat]
[enormous huge big fat large great gigantic]
[huge big large great fat enormous gigantic]
[]