Go 言語で「基礎プログラミング演習 I 〜100 本ノック中級編」を解いてみる-No.59「行列の和」

はじめに

「基礎プログラミング演習 I 〜100 本ノック中級編」を解いてみます。

取り扱う問題は以下のサイトを引用させていただきました。

検証環境

$ uname -moi
x86_64 unknown GNU/Linux

$ head -n 2 /etc/os-release
PRETTY_NAME="Debian GNU/Linux 10 (buster)"
NAME="Debian GNU/Linux"

$ go version | head -n 1
go version go1.16.3 linux/amd64

問題

No. 59 行列の和

3x3 行列の和を求めて表示するプログラムを作成せよ。行列の値は 2 次元配列で表現し、繰り返しを使って計算すること。
3x3 行列とは縦 3 つ、横 3 つの 9 つの要素(値)をひとまとめにして扱うものである。2 つの 3x3 行列の和は次式のように、それぞれ同じ位置にある値を足したものとして計算できる。

例えば a12 という要素は、1 行目 2 列目の要素という意味である。それぞれ同じ位置にある要素を足せばよい。
なお、入力値は 1 行ずつ 3 つの値をスペースで区切って入力するようにするとよい。このためには、scanf("%d %d %d", &a[0][0], &a[0][1], &a[0][2]);のように書く(No. 57 参照)。

# 【実行例、下線部は入力例】
$ ./knock59
1つめの行列
1 2 3
4 5 6
7 8 9
1つめの行列
2 3 4
5 6 7
8 9 1
和
3   5   7
9   11  13
15  17  10
$

※おそらく上記の実行例のメッセージは一部誤りかと思われる。「1 つめの行列」のメッセージが 2 回繰り返されているが、2 回目は「2 つめの行列」というメッセージが正しいと思われる。

回答

knock59.go

package main

import (
    "fmt"
)

func main() {
    matrixes := [][][]int{
        make([][]int, 3),
        make([][]int, 3),
    }

    for mtx := 0; mtx < len(matrixes); mtx++ {
        fmt.Printf("%dつめの行列\n", (mtx + 1))
        for row := 0; row < len(matrixes[mtx]); row++ {
            columns := make([]int, 3)
            fmt.Scanf("%d %d %d", &columns[0], &columns[1], &columns[2])
            matrixes[mtx][row] = columns
        }
    }

    fmt.Println("和")
    for row := 0; row < len(matrixes[0]); row++ {
        fmt.Printf(
            "%d\t%d\t%d\n",
            matrixes[0][row][0]+matrixes[1][row][0],
            matrixes[0][row][1]+matrixes[1][row][1],
            matrixes[0][row][2]+matrixes[1][row][2],
        )
    }
}

実行

$ go run knock59.go
1つめの行列
1 2 3
4 5 6
7 8 9
2つめの行列
2 3 4
5 6 7
8 9 1
和
3       5       7
9       11      13
15      17      10

ひとこと

多次元配列を使い始めるとコドが読みにくくなってきますね。

Posted by genzouw