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

はじめに

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

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

検証環境

1
2
3
4
5
6
7
8
9
$ 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 参照)。

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
# 【実行例、下線部は入力例】
$ ./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

 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
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],
		)
	}
}

実行

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
$ 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

ひとこと

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