fork download
  1. package main
  2.  
  3. import (
  4. "bufio"
  5. "fmt"
  6. "os"
  7. "sort"
  8. "strconv"
  9. "strings"
  10. )
  11.  
  12. type PasanganKlub struct {
  13. Klub string
  14. Poin int
  15. }
  16.  
  17. type Klasemen struct {
  18. poin map[string]int
  19. urutan []string // menyimpan urutan klub saat didaftarkan (untuk urutan tampil awal)
  20. }
  21.  
  22. func NewKlasemen(klub []string) *Klasemen {
  23. poin := make(map[string]int)
  24. urutan := make([]string, 0, len(klub))
  25. for _, k := range klub {
  26. poin[k] = 0
  27. urutan = append(urutan, k)
  28. }
  29. return &Klasemen{poin: poin, urutan: urutan}
  30. }
  31.  
  32. func (k *Klasemen) tambahKlubJikaBelumAda(klub string) {
  33. if _, ada := k.poin[klub]; !ada {
  34. k.poin[klub] = 0
  35. k.urutan = append(k.urutan, klub)
  36. }
  37. }
  38.  
  39. func (k *Klasemen) CatatPermainan(klubKandang, klubTandang, skor string) {
  40. k.tambahKlubJikaBelumAda(klubKandang)
  41. k.tambahKlubJikaBelumAda(klubTandang)
  42.  
  43. bagian := strings.Split(skor, ":")
  44. if len(bagian) != 2 {
  45. panic(fmt.Sprintf("format skor tidak valid: %q", skor))
  46. }
  47.  
  48. skorKandang, err1 := strconv.Atoi(strings.TrimSpace(bagian[0]))
  49. skorTandang, err2 := strconv.Atoi(strings.TrimSpace(bagian[1]))
  50. if err1 != nil || err2 != nil {
  51. panic(fmt.Sprintf("format skor tidak valid: %q", skor))
  52. }
  53.  
  54. switch {
  55. case skorKandang > skorTandang:
  56. k.poin[klubKandang] += 3
  57. case skorKandang < skorTandang:
  58. k.poin[klubTandang] += 3
  59. default:
  60. k.poin[klubKandang] += 1
  61. k.poin[klubTandang] += 1
  62. }
  63. }
  64.  
  65. func (k *Klasemen) CetakKlasemen() []PasanganKlub {
  66. hasil := make([]PasanganKlub, 0, len(k.poin))
  67. for _, klub := range k.urutan {
  68. hasil = append(hasil, PasanganKlub{Klub: klub, Poin: k.poin[klub]})
  69. }
  70.  
  71. sort.SliceStable(hasil, func(i, j int) bool {
  72. return hasil[i].Poin > hasil[j].Poin
  73. })
  74.  
  75. return hasil
  76. }
  77.  
  78. func (k *Klasemen) AmbilPeringkat(nomorPeringkat int) string {
  79. klasemen := k.CetakKlasemen()
  80. if nomorPeringkat < 1 || nomorPeringkat > len(klasemen) {
  81. return ""
  82. }
  83. return klasemen[nomorPeringkat-1].Klub
  84. }
  85.  
  86. func main() {
  87. reader := bufio.NewReader(os.Stdin)
  88. baca := func() string {
  89. s, _ := reader.ReadString('\n')
  90. return strings.TrimSpace(s)
  91. }
  92.  
  93. n, _ := strconv.Atoi(baca())
  94. var namaKlub []string
  95. for len(namaKlub) < n {
  96. baris := baca()
  97. namaKlub = append(namaKlub, strings.Fields(baris)...)
  98. }
  99.  
  100. klasemen := NewKlasemen(namaKlub)
  101.  
  102. m, _ := strconv.Atoi(baca())
  103. for i := 0; i < m; i++ {
  104. baris := strings.Fields(baca())
  105. klasemen.CatatPermainan(baris[0], baris[1], baris[2])
  106. }
  107.  
  108. fmt.Println("Klasemen:")
  109. for i, pasangan := range klasemen.CetakKlasemen() {
  110. fmt.Printf("%d. %s => %d poin\n", i+1, pasangan.Klub, pasangan.Poin)
  111. }
  112.  
  113. q, _ := strconv.Atoi(baca())
  114. for i := 0; i < q; i++ {
  115. nomor, _ := strconv.Atoi(baca())
  116. fmt.Printf("Peringkat ke-%d: %s\n", nomor, klasemen.AmbilPeringkat(nomor))
  117. }
  118. }
Success #stdin #stdout 0s 5304KB
stdin
3
Liverpool Chelsea Arsenal
6
Arsenal Liverpool 2:1
Arsenal Chelsea 1:1
Chelsea Arsenal 0:3
Chelsea Liverpool 3:2
Liverpool Arsenal 2:2
Liverpool Chelsea 0:0
1
2
stdout
Klasemen:
1. Arsenal => 8 poin
2. Chelsea => 5 poin
3. Liverpool => 2 poin
Peringkat ke-2: Chelsea