summaryrefslogtreecommitdiff
path: root/go/book-store/book_store.go
blob: faadeb50f883f0d3975a3ed0a0d315fa249a7c18 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
package bookstore

var (
	discounts = []int{0, 0, 5, 10, 20, 25} // percent
	bookPrice = 800                        // cents
)

func countMax(books []int) (int, map[int]int) {
	m := make(map[int]int)
	for _, v := range books {
		m[v]++
	}
	var max int
	for _, v := range m {
		if v > max {
			max = v
		}
	}
	return max, m
}

func calcPrice(baskets [][]int) int {
	var sum int
	for _, v := range baskets {
		percent := discounts[len(v)]
		price := bookPrice - bookPrice*percent/100
		sum += len(v) * price
	}
	return sum
}

func distributeFullCountBooks(baskets [][]int, m map[int]int, n int) {
	for k, v := range m {
		if v == n {
			for i := range baskets {
				baskets[i] = append(baskets[i], k)
			}
			delete(m, k)
		}
	}
}

func Cost(books []int) int {
	n, m := countMax(books)
	baskets := make([][]int, n)
	distributeFullCountBooks(baskets, m, n)
	return calcPrice(baskets)
}