パパエンジニアのポエム

奥さんと娘ちゃんへの愛が止まらない

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からのフィードバック

f:id:yuki-toida:20180911172847p:plain

最後の配列を出力する際に、Cとxの入れ子にするのではなく、fmtパッケージ使うと少し実行時間とメモリの省力化に繋がりました。

ただ[]の見た目がかなりイケてないのでプロダクションで使うなら util パッケージに押し込めるのがいいかもですね。

   for _, x := range C {
        fmt.Printf("%v\n", strings.Trim(fmt.Sprint(x), "[]"))
    }