今回は新・Bランクアップの最後の問題です。
非常に長くなりそうなので、今回は解答に向けての戦略編です。
19 【配列 2】立体で計算
N × N × N の三次元配列が与えられるので、N 要素からなる縦列・横列・斜め列の和のうち、最大値を求めてください。
斜め列については、配列を立方体に見立てたときに各面を通るような斜め列と対角線のような斜め列が存在することに注意してください。
例として、下図の右下の要素を通るような斜め列は各面を通るような 3 つと立方体の中を通るような 1 つの計 4 つ存在します。
問題文の下の図は省略しています。paizaでご覧ください。
| 入力例 | 出力例 | |
| 2 | 6 | |
| 1 2 | ||
| 2 3 | ||
| 3 2 | ||
| 2 1 |
正直この問題文と入力例で理解できましたか。
いつものように非常に不親切な問題文だと思います。全く意味不明です。
その上、添付されている図をみれば、さらに混迷をが深まるばかりです。
これで、正解率が60%ですから、解答者のレベルって相当高いようです。というよりも私が低すぎるのでしょうね。
さて、本問は立体で考えると混乱するばかりです。
二次元の配列がN枚奥に向かって積み重なっているようなイメージでないと解けないと思います。
(行N X 列N)のパネルがN枚奥に向かって積み重なっていると考えればイメージしやすいのではないでしょうか。
例題の2X2X2の配列について考えてみましょう。
これが分かれば、Nがいくらでも対応できます。
求めるものは縦列、横列、斜め列の和の最大値です。
例題にそって、三次元配列は[[[1, 2], [2, 3]], [[3, 2], [2, 1]]]を作成します。
これらの配列のアドレスは[枚数番号 行番号 列番号]で構成されていると考えてください。
下記のとおりに各データにアドレスが決まりました。
1 2 [000] [001] 2 3 [010] [011] 1番目の配列
3 2 [100] [101] 2 1 [110] [111] 2番目の配列
1番目の配列構造 1 [000] 2[001] 2番目に配列構造 3 [100] 2 [101]
2 [010] 3[011] 2 [110] 1 [111]
これがこれから考える出発点となります。
ここから、縦列、横列、斜め列の和を考えていきます。
やさしい和から順に考えてみましょう。
① 同面横列(→)
同面横列の和は下記の通りになります。
1 2 [000] [001] 3
2 3 [010] [011] 5
3 2 [100] [101] 5
2 1 [110] [111] 3
これは単純ですね。
② 同面縦行(↓)
同面縦列の和は下記の通りになります。
1 2 [000] [010] 3
2 3 [001] [011] 5
3 2 [100] [110] 5
2 1 [101] [111] 3
③ 同面内交差(↘↙)
同面内交差の和は下記の通りです。
1 3 [000] [011] 4
2 2 [001] [010] 4
3 1 [100] [111] 4
2 2 [101] [110] 4
④ 異面同行同列
異面同行同列の和は下記のとおりです。
1 3 [000] [100] 4
2 2 [001] [101] 4
2 3 [010] [110] 4
3 1 [011] [111] 4
⑤ 異面同行異列(斜め)
異面同行異列の和は下記の通りです。
1 2 [000] [101] 3
2 1 [010] [111] 3
2 3 [001] [100] 5
3 2 [011] [110] 5
⑥ 異面異行同列(斜め)
異面異行同列の和は下記の通りです。
1 2 [000] [110] 3
2 1 [001] [111] 3
2 3 [010] [100] 5
3 2 [011] [101] 5
⑦異面異行異列(斜め)
異面異行異列の和は下記の通りです。
1 1 [000] [111] 2
2 2 [001] [110] 4
2 2 [010] [101] 4
3 3 [011] [100] 6
以上7通りが考えられます。本問の答えは最大値6となります。
要は自分以外と他の7つの数字との和を考えればよいということです。
7つのケースについて個々にどのようにLoopさせればよいかを考えましょう。
これが一筋縄でいかず7通りの工夫が必要です。
次回は具体的にプログラムを見ながら考えていきましょう。