paiza プログラミング

[Ruby|Python]paiza 標準出力メニュー 【n * n の 2 次元配列の表示】

paiza_stdout_6

今回はpaiza 標準入力メニューセクション6【n * n の 2 次元配列の表示】を解説します。

セクション6は、任意の二次元配列を生成し、出力する問題です。

本記事で使用しているメソッドについて

解答例で使っているメソッドについて、下記の記事で詳しく解説していますので参考にしてみて下さい。

セクション6:【n * n の 2 次元配列の表示】

6-STEP1: 2 * 2 の出力 (paizaランク D 相当)

4個の整数 0, 8, 1, 3 をこの順番で 2 行 2 列で出力する問題です。

Ruby解答例1

4個の整数が2 * 2 の二次元配列ary=[[0, 8], [1, 3]]だった場合

ary.each do |row|で各行を先頭から順に参照し、joinメソッドで各行の要素を半角スペースで連結して表示しています。

# 解答例1
ary = [[0, 8], [1, 3]]
# 出力
ary.each do |row|
  # 1 行毎に半角スペース区切りで出力する
  puts(row.join(" "))
end
Ruby解答例2

解答例1を1行にまとめた書き方です。
行の各要素を半角スペースで連結し、putsメソッドで出力しています。

# 解答例2
ary = [[0, 8], [1, 3]]
# 出力
puts(ary.map { |row| row.join(" ") })
Ruby解答例3

4個の整数が一次元配列ary=[0, 8, 1, 3]だった場合

空の配列rowを用意し、配列aryを先頭から順に参照します。
整数の要素n配列rowに追加し、配列rowの要素数が w=2 になったら、半角スペースで連結して出力し、配列rowを空にします。

# 解答例3
w = 2
ary = [0, 8, 1, 3]
# 出力
row = []
# ary の先頭から順に参照する
ary.each do |n|
  # n を row に追加する
  row.push(n)
  # 要素数 w=2 個毎に半角スペース区切りで出力する
  if row.length == w
    puts(row.join(" "))
    row = []
  end
end
Python解答例1

4個の整数が2 * 2 の二次元配列ary=[[0, 8], [1, 3]]だった場合

for row in aryで各行を先頭から順に参照し、配列rowをアンパックして出力しています。

# 解答例1
ary = [[0, 8], [1, 3]]
# 出力
for row in ary:
    # 1 行毎に半角スペース区切りで出力する
    print(*row)
Python解答例2

解答例1を1行にまとめた書き方です。
リスト内包表記で各行を参照し、アンパックして出力しています。

# 解答例2
ary = [[0, 8], [1, 3]]
# 出力
[print(*row) for row in ary]
Python解答例3

4個の整数が一次元配列ary=[0, 8, 1, 3]だった場合

空の配列rowを用意し、配列aryを先頭から順に参照します。
整数の要素n配列rowに追加し、配列rowの要素数が w=2 になったら、アンパックで出力し、配列rowを空にします。

# 解答例3
w = 2
ary = [0, 8, 1, 3]
# 出力
row = []
# ary の先頭から順に参照する
for n in ary:
    # n を row に追加する
    row.append(n)
    # 要素数 w=2 個毎に半角スペース区切りで出力する
    if len(row) == w:
        print(*row)
        row = []

 


6-STEP2: 3 * 3 の出力 (paizaランク D 相当)

半角スペース区切りで入力された9個の文字列3 行 3 列の形式で出力する問題です。
※ 各行は改行区切り、行の各要素は半角スペース区切り

入出力例
# 入出力例
INPUT1 = <<~"EOS"
  0 1 2 3 4 5 6 7 8
EOS
OUTPUT1 = <<~"EOS"
  0 1 2
  3 4 5
  6 7 8
EOS
Ruby解答例1

半角スペース区切りの9個の整数を一次元配列aryに格納します。
空の配列row を用意し、配列aryの先頭から順に参照します。
整数の要素n配列rowに追加し、要素数が w=3 になったら配列rowを半角スペースで連結して出力し、rowを空にします。

# 解答例1
w = 3
# 入力
ary = gets.split.map(&:to_i)
# ary の先頭から順に参照する
row = []
ary.each do |n|
  # ary の先頭から要素を取り出して row に追加する
  row.push(n)
  # 要素数 w=3 個毎に row を出力し row を空にする
  if row.length == w
    puts(row.join(" "))
    row = []
  end
end
Ruby解答例2

3 行 3 列の二次元配列matrixを生成してから、まとめて出力する方法です。

半角スペース区切りの9個の整数を一次元配列aryに格納します。
空の配列matrix, row を用意し、配列aryの先頭から順に参照します。
整数の要素n配列rowに追加し、要素数が w=3 になったら配列row二次元配列matrixに追加し、配列rowを空にします。
3 行 3 列の二次元配列matrixの行の各要素を半角スペースで連結し、putsメソッドで出力しています。

# 解答例2
w = 3
# 入力
ary = gets.split.map(&:to_i)
# 3 x 3 の行列を作成
matrix = []
row = []
# ary の先頭から順に参照する
ary.each do |n|
  # n を row に追加する
  row.push(n)
  # 要素数 w=3 個毎に row を matrix に追加し row を空にする
  if row.length == w
    matrix.push(row)
    row = []
  end
end
# 出力
puts(matrix.map { |row| row.join(" ") })
Python解答例1

半角スペース区切りの9個の整数を一次元配列aryに格納します。
空の配列row を用意し、配列aryの先頭から順に参照します。
整数の要素n配列rowに追加し、要素数が w=3 になったら配列rowをアンパックして出力し、rowを空にします。

# 解答例1
w = 3
# 入力
ary = map(int, input().split())
# ary の先頭から順に参照する
row = []
for n in ary:
    # n を row に追加する
    row.append(n)
    # 要素数 w=3 個毎に row を出力し row を空にする
    if len(row) == w:
        print(*row)
        row = []
Python解答例2

3 行 3 列の二次元配列matrixを生成してから、まとめて出力する方法です。

半角スペース区切りの9個の整数を一次元配列aryに格納します。
空の配列matrix, row を用意し、配列aryの先頭から順に参照します。
整数の要素n配列rowに追加し、要素数が w=3 になったら配列row二次元配列matrixに追加し、配列rowを空にします。
3 行 3 列の二次元配列matrixをリスト内包表記で各行を参照し、要素をアンパックして出力しています。

# 解答例2
w = 3
# 入力
ary = map(int, input().split())
# 3 x 3 の行列を作成
matrix = []
row = []
# ary の先頭から順に参照する
for n in ary:
    # n を row に追加する
    row.append(n)
    # 要素数 w=3 個毎に row を matrix に追加し row を空にする
    if len(row) == w:
        matrix.append(row)
        row = []
# 出力
[print(*row) for row in matrix]

 


6-STEP3: 九九表の出力 (paizaランク D 相当)

9 行 9列で九九の答えを出力する問題です。
※ 各行は改行区切り、行の各要素は半角スペース区切り

Ruby解答例1

i=1 から 9j=1 から 9 の二重ループを設定し、各iの段の答えの配列danを生成し、半角スペース区切りで出力しています。

# 解答例1
# i=1 から 9 までのループを設定
1.upto(9) do |i|
  # i の段の答えを配列 dan に格納
  dan = 1.upto(9).map { |j| i * j }
  # 出力
  puts(dan.join(" "))
end
Ruby解答例2

9 行 9 列の二次元配列kukuを生成してから、まとめて出力する方法です。

空の配列kukuを用意し、i=1 から 9j=1 から 9 の二重ループを設定します。
各iの段の答えの配列danを生成し、二次元配列kukuに追加します。
二次元配列kukuの行の各要素を半角スペースで連結し、putsメソッドで出力しています。

# 解答例2
# 九九の表を作成
kuku = []
# 1 から9 までの二重ループを設定
1.upto(9) do |i|
  # i の段の答え 配列 dan を配列 kuku に追加
  dan = 1.upto(9).map { |j| i * j }
  kuku.push(dan)
end
# 出力
puts(kuku.map { |dan| dan.join(" ") })
Python解答例1

i=1 から 9j=1 から 9 の二重ループを設定し、各iの段の答えの配列danを生成し、アンパックして出力しています。

# 解答例1
# 1 から9 までの二重ループを設定
for i in range(1, 10):
    # i の段の答えを配列 dan に格納
    dan = [i * j for j in range(1, 10)]
    # 出力
    print(*dan)
Python解答例2

9 行 9 列の二次元配列kukuを生成してから、まとめて出力する方法です。

空の配列kukuを用意し、i=1 から 9j=1 から 9 の二重ループを設定します。
各iの段の答えの配列danを生成し、二次元配列kukuに追加します。
二次元配列kukuをリスト内包表記で各行を参照し、要素をアンパックして出力しています。

# 解答例2
# 九九の表を作成
kuku = []
# 1 から9 までの二重ループを設定
for i in range(1, 10):
    # i の段の答え 配列 dan を配列 kuku に追加
    dan = [i * j for j in range(1, 10)]
    kuku.append(dan)
# 出力
[print(*dan) for dan in kuku]

6-FINAL: 【n * n の 2 次元配列の表示】N * N の九九表の出力 (paizaランク C 相当)

整数nが与えられるので、 n 行 n列で九九の答えを出力する問題です。
※ 各行は改行区切り、行の各要素は半角スペース区切り

入出力例
# 入出力例
INPUT1 = <<~"EOS"
  3
EOS
OUTPUT1 = <<~"EOS"
  1 2 3
  2 4 6
  3 6 9
EOS
Ruby解答例1

整数nを受け取ります。
i=1 から n
 、j=1 から n の二重ループを設定し、各iの段の答えの配列danを生成し、半角スペース区切りで出力しています。

# 解答例1
# 入力
n = gets.to_i
# 1 から n までの二重ループを設定
1.upto(n) do |i|
  # i の段の答えを配列 dan に格納
  dan = 1.upto(n).map { |j| i * j }
  # 出力
  puts(dan.join(" "))
end
Ruby解答例2

n 行 n 列の二次元配列kukuを生成してから、まとめて出力する方法です。

整数nを受け取ります。
空の配列kuku
を用意し、i=1 から nj=1 から n の二重ループを設定します。
各iの段の答えの配列danを生成し、二次元配列kukuに追加します。
二次元配列kukuの行の各要素を半角スペースで連結し、putsメソッドで出力しています。

# 解答例2
# 入力
n = gets.to_i
# n * n の表を作成
kuku = []
# 1 から n までの二重ループを設定
1.upto(n) do |i|
  # i の段の答え 配列 dan を配列 kuku に追加
  dan = 1.upto(n).map { |j| i * j }
  kuku.push(dan)
end
# 出力
puts(kuku.map { |dan| dan.join(" ") })
Python解答例1

整数nを受け取ります。
i=1 から n
 、j=1 から n の二重ループを設定し、各iの段の答えの配列danを生成し、アンパックして出力しています。

# 解答例1
# 入力
n = int(input())
# 1 から n までの二重ループを設定
for i in range(1, n + 1):
    # i の段の答えを配列 dan に格納
    dan = [i * j for j in range(1, n + 1)]
    # 出力
    print(*dan)
Python解答例2

n 行 n 列の二次元配列kukuを生成してから、まとめて出力する方法です。

整数nを受け取ります。
空の配列kuku
を用意し、i=1 から nj=1 から n の二重ループを設定します。
各iの段の答えの配列danを生成し、二次元配列kukuに追加します。
二次元配列kukuをリスト内包表記で各行を参照し、要素をアンパックして出力しています。

# 解答例1
# 入力
n = int(input())
# 1 から n までの二重ループを設定
for i in range(1, n + 1):
    # i の段の答えを配列 dan に格納
    dan = [i * j for j in range(1, n + 1)]
    # 出力
    print(*dan)

今回のまとめ

Ruby, Python 共通

  • 配列に配列を追加すると、二次元配列(多次元配列)を生成することができる

Ruby 二次元配列を出力

  • puts(二次元配列.map { |行配列| 行配列.join(" 区切り文字") })

Python 二次元配列を出力

  • [print(*行配列) for 行配列 in 二次元配列](アンパック)
  • [print("区切り文字".join(行配列)) for 行配列 in 二次元配列](joinメソッド)

セクション6では要素の長さが揃っている二次元配列を扱いました。
次は、要素の長さが異なる二次元配列(ジャグ配列)です!



【PR】アルゴリズム学習でお世話になった本


アルゴリズム関連の技術書は大抵C/C++で書かれていますが、ある程度プログラムが出来れば、処理の流れは理解することが出来ます。






通称: 螺旋本。C++で解説されています。AOJ(Aizu Online Judge)を運営している会津大学の渡辺准教授が書いた本です。データ構造や計算量の内容から丁寧に書いてありますのでアルゴリズム学習の最初の参考書としてオススメです。







通称: 蟻本。C++で解説されています。競技プログラミング中級者の定番書と言われていて、競技プログラミングで利用できる色々なアルゴリズムを学ぶことが出来ます。かなり高度な内容も含まれているので1冊分を完全に理解するのにはかなりの時間がかかりそうですが、手元に置いて何度も読み返しています。







通称: チーター本。C#, C++, JAVAでTopcoderの問題を解説しています。初心者~中級者向けに書かれているので解説が非常に丁寧です。







Python3でアルゴリズムを解説している本です。講義スタイルの本で、図やフローチャートを使ってアルゴリズムとデータ構造についてしっかりと説明されています。代わりにコードは少なめです。Pythonコードが読めなくても十分理解できると思います。


-paiza, プログラミング
-,

© 2024 じゃいごテック