Golangでプロコンの問題を解く 行列編
前回同様、AOJの問題を解いてみます。 yuki-toida.hatenablog.com
行列の問題をやってみた
問題
https://onlinejudge.u-aizu.ac.jp/courses/lesson/2/ITP1/7/ITP1_7_D
自分が書いたコードはこちら
package main import ( "bufio" "fmt" "os" "strconv" "strings" ) // 行列の積 func main() { sc := bufio.NewScanner(os.Stdin) sc.Scan() nml := strings.Split(sc.Text(), " ") n, _ := strconv.Atoi(nml[0]) m, _ := strconv.Atoi(nml[1]) l, _ := strconv.Atoi(nml[2]) A := make([][]string, n) B := make([][]string, m) for i := 0; i < n; i++ { sc.Scan() A[i] = make([]string, m) for j, v := range strings.Split(sc.Text(), " ") { A[i][j] = v } } for i := 0; i < m; i++ { sc.Scan() B[i] = make([]string, l) for j, v := range strings.Split(sc.Text(), " ") { B[i][j] = v } } C := make([][]int64, n) for i := 0; i < n; i++ { C[i] = make([]int64, l) for j := 0; j < l; j++ { for k := 0; k < m; k++ { v1 := parseInt64(A[i][k]) v2 := parseInt64(B[k][j]) C[i][j] += v1 * v2 } } } for _, x := range C { fmt.Printf("%v\n", strings.Trim(fmt.Sprint(x), "[]")) } } func parseInt64(s string) int64 { v, _ := strconv.ParseInt(s, 10, 64) return v }
AOJからのフィードバック
最後の配列を出力する際に、Cとxの入れ子にするのではなく、fmtパッケージ使うと少し実行時間とメモリの省力化に繋がりました。
ただ[]
の見た目がかなりイケてないのでプロダクションで使うなら util
パッケージに押し込めるのがいいかもですね。
for _, x := range C { fmt.Printf("%v\n", strings.Trim(fmt.Sprint(x), "[]")) }