0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

paizaラーニング問題集「【配列 2】立体で計算」を解いてみた

Posted at

▼考え方

N=3(3×3×3)の三次元配列が与えられたことを想定し、3要素からなる縦列・横列・斜め列の和のうち最大値を求めるという前提で、説明します。

[概要]
3×3×3の立方体を考えます。要素は1~27の数字とします。
image.png

[処理1]
x,z軸における縦列・横列・斜め列の和を計算します。
image.png

[処理2]
y,z軸における縦列・横列・斜め列の和を計算します。
image.png

[処理3]
x,y軸における斜め列の和の計算を計算します。縦列・横列は処理1,2で計算済みです。
image.png

[処理4]
x,y,z軸における斜め列の和の計算を計算します。
image.png

[処理5]
処理1~4で求めた列の和の最大値の計算をします。

▼コード

########## 処理0(準備) インプット,リスト定義 ###########

N = int(input())

A = []

########## 処理1 x,z軸における縦列・横列・斜め列の和の計算 ###########

# xz: 縦列の和の計算用のリスト
xz = []

# xz_naname: 斜め列の和の計算用のリスト
xz_naname = [0]*2*N

# xz_tmp: 3×3の入力ごとに計算するためのリスト
xz_tmp = [[0]*N]*N

for i in range(N):

    for j in range(N):
        xz_tmp[j] = list(map(int,input().split()))
        A.append(xz_tmp[j])

    for j in range(N):
        xz.append(sum(xz_tmp[j]))
        xz_naname[2*i] += xz_tmp[j][N-1-j]

        for k in range(N):
            if j == 0:
                xz.append(sum(xz_tmp_r[k] for xz_tmp_r in xz_tmp))
            if j == k:
                xz_naname[2*i+1] += xz_tmp[j][k]

    xz_tmp = [[0]*N]*N

########## 処理2 y,z軸における縦列・横列・斜め列の和の計算 ###########

# yz: 縦列の和の計算用のリスト
yz = [0]*(N**2)

# yz_naname: 斜め列の和の計算用のリスト
yz_naname = [0]*2*(N**2)

s = 0
for j in range(N):
    for i in range(N):
        yz_naname[2*j] += A[(N-1)+(N-1)*i][j]
        yz_naname[2*j+1] += A[0+(N+1)*i][j]
        
        for k in range(N):
            yz[s] += A[j+N*k][i]
        s += 1

########## 処理3 x,y軸における斜め列の和の計算 ###########
########## ※縦列・横列は処理1,2で計算済み ###########

# xy_naname: 斜め列の和の計算用のリスト
xy_naname = [0]*2*(N**2)

for j in range(N):
    for i in range(N):
        xy_naname[2*j] += A[j+N*i][i]
        xy_naname[2*j+1] += A[j+N*i][(N-1)-i]

########## 処理4 x,y,z軸における斜め列の和の計算 ###########

# xyz_naname: 斜め列の和の計算用のリスト
xyz_naname = [0]*4

for j in range(N):
    xyz_naname[0] += A[(N-1)+(N-1)*j][0+j]
    xyz_naname[1] += A[(N-1)+(N-1)*j][(N-1)-j]
    xyz_naname[2] += A[(N*N-1)-(N+1)*j][0+j]
    xyz_naname[3] += A[(N*N-1)-(N+1)*j][(N-1)-j]

########## 処理5 処理1~4で求めた列の和の最大値の計算 ###########

print(max(xz + xz_naname + yz + yz_naname + xy_naname + xyz_naname))

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?