プログラミングコンテストチャレンジブック(2-2)
本ではpairを使ってソートして解いているのだが、Goにはpair型がないっぽいので、擬似的に2要素の配列とそのスライスに名前をつけてsort出来るようにした。
package main import ( "fmt" "sort" ) type pair [2]int type Pi []pair func (p Pi) Len() int { return len(p) } func (p Pi) Less(i,j int) bool { return p[i][1] < p[j][1] } func (p Pi) Swap(i,j int) { p[i],p[j] = p[j],p[i] } func main() { s := [5]int{1, 2, 4, 6, 8} t := [5]int{3, 5, 7, 9, 10} itv := make(Pi, 5) for i := 0; i<len(s); i++ { itv[i] = pair{s[i],t[i]} } sort.Sort(itv) ans := 0 time := 0 tasks := []int{} for j := 0; j<len(s); j++ { if time < itv[j][0] { ans++ time = itv[j][1] tasks = append(tasks, j) } } fmt.Printf("%d tasks %v\n", ans,tasks) }
書いてて、あれ、配列のスライスは辞書順でソートしてくれるかな?と思い、
itv := make([][2]int,5)
に変更してコンパイルしてみたらやはり通らなかった。
schedule.go:22: cannot use itv (type [][2]int) as type sort.Interface in function argument: [][2]int does not implement sort.Interface (missing Len method)
ちょっと、スライスの使い方がわかってきたような気がする。