今回はpaiza 標準入力メニューセクション7【行によって長さが違う二次元配列の表示】を解説します。
セクション7は、長さが異なる二次元配列(ジャグ配列)を生成し、出力する問題です。
本記事で使用しているメソッドについて
解答例で使っているメソッドについて、下記の記事で詳しく解説していますので参考にしてみて下さい。
- [Ruby] 標準入力によるデータ取得1
- [Ruby] 標準入力によるデータ取得2
- [Ruby] 標準入力によるデータ取得3
- [Ruby] 標準出力(データを任意に整形して出力する)
- [Ruby]配列の基本操作1
- [Ruby]繰り返し処理
セクション7:【行によって長さが違う二次元配列の表示】
7-STEP1: N 個の文字を半分ずつ出力 (paizaランク D 相当)
偶数nが入力され、1行目に 1 以上 n/2 以下の整数、2行目に n/2+1 以上 n 以下の整数を半角スペース区切りで出力する問題です。
入出力例
# 入出力例 INPUT1 = <<~"EOS" 8 EOS OUTPUT1 = <<~"EOS" 1 2 3 4 5 6 7 8 EOS
Ruby解答例
整数nを受け取り、1からnまでの整数の配列aryを生成します。
1行目は、ary[...n / 2]で、整数 1 から n/2 までをスライスして、joinメソッドで半角スペースで連結して出力、
2行目は、ary[n / 2..]で、整数 n+1 から n までをスライスして、joinメソッドで半角スペースで連結して出力しています。
# 解答例
# 入力 (n は偶数)
n = gets.to_i
# 配列生成
ary = (1..n).to_a
# 出力
puts(ary[...n / 2].join(" "))
puts(ary[n / 2..].join(" "))
Python解答例
整数nを受け取り、1からnまでの整数の配列aryを生成します。
1行目は、ary[:n//2]で、整数 1 から n/2 までをスライスし、アンパックして出力、
2行目は、ary[n//2:]で、整数 n+1 から n までをスライスし、アンパックして出力しています。
# 解答例 # 入力 (n は偶数) n = int(input()) # 配列生成 ary = list(range(1, n + 1)) # 出力 print(*ary[:n//2]) print(*ary[n//2:])
7-STEP2: 数値を異なる長さで 2 行出力 (paizaランク D 相当)
整数n, m が入力され、1行目に 1 以上 n 以下の整数、2行目に 1 以上 m 以下の整数を半角スペース区切りで出力する問題です。
入出力例
入力例1 3 5 出力例1 1 2 3 1 2 3 4 5
Ruby解答例
整数n , mを受け取り、1 から n までの整数の配列ary_nと1 から m までの整数の配列ary_mを生成します。
1行目で配列ary_nを半角スペース区切りで出力、2行目で配列ary_mを半角スペース区切りで出力します。
# 解答例
# 入力
n, m = gets.split.map(&:to_i)
# ary_n: 1 以上 n 以下の整数の配列
ary_n =(1..n).to_a
# ary_m: 1 以上 m 以下の整数の配列
ary_m =(1..m).to_a
# 出力
puts(ary_n.join(" "))
puts(ary_m.join(" "))
Python解答例
整数n , mを受け取り、1 から n までの整数の配列ary_nと、1 から m までの整数の配列ary_mを生成します。
1行目で配列ary_nを半角スペース区切りで出力、2行目で配列ary_mを半角スペース区切りで出力します。
# 解答例 # 入力 n, m = map(int, input().split()) # ary_n: 1 以上 n 以下の整数の配列 ary_n = list(range(1, n + 1)) # ary_m: 1 以上 m 以下の整数の配列 ary_m = list(range(1, m + 1)) # 出力 print(*ary_n) print(*ary_m)
7-STEP3: 直角三角形の出力 (paizaランク D 相当)
整数nが与えられ、1 から n までの整数の配列ary_nと1 から m までの整数の配列ary_mを生成します。
入出力例
# 入出力例 INPUT1 = <<~"EOS" 4 EOS OUTPUT1 = <<~"EOS" 1 1 2 1 2 3 1 2 3 4 EOS INPUT2 = <<~"EOS" 1 EOS OUTPUT2 = <<~"EOS" 1 EOS
Ruby解答例1
i=1 から n のループを設定し、ループ内で 1からi までの配列を生成し、joinメソッドで半角スペースで連結して出力しています。
# 解答例1
# 入力
n = gets.to_i
# 出力
1.upto(n) do |i|
puts((1..i).to_a.join(" "))
end
Ruby解答例2
Ruby解答例1のループ部分を1行にまとめると下記のようになります。
# 解答例2
# 入力
n = gets.to_i
# 出力
1.upto(n) { |i| puts((1..i).to_a.join(" ")) }
Python解答例1
i=1 から n のループを設定し、ループ内で 1からi までの範囲オブジェクトを生成し、アンパックして出力しています。
# 解答例1 # 入力 n = int(input()) # 出力 for i in range(1, n + 1): print(*range(1, i + 1))
Python解答例2
Python解答例1のループ部分を1行にまとめると下記のようになります。
# 解答例2 # 入力 n = int(input()) # 出力 [print(*range(1, i + 1)) for i in range(1, n + 1)]
7-STEP4: すべての行の長さが不定な 2 次元配列の出力 (paizaランク C 相当)
整数n と、半角スペース区切りでn個の数列mが与えられ、i=1 から n までの各 i について、1 以上 m_i 以下の整数を昇順、半角スペース区切りで出力する問題です。
入出力例
# 入出力例 INPUT1 = <<~"EOS" 4 2 4 3 1 EOS OUTPUT1 = <<~"EOS" 1 2 1 2 3 4 1 2 3 1 EOS INPUT2 = <<~"EOS" 1 1 EOS OUTPUT2 = <<~"EOS" 1 EOS
Ruby解答例1
整数n, 数列aryを受け取り、数列aryを先頭から順に参照して、 ループ内で 1 から m までの配列を生成し、joinメソッドで半角スペースで連結して出力しています。
# 解答例1
# 入力
n = gets.to_i
ary = gets.split.map(&:to_i)
# 出力
ary.each do |m|
puts((1..m).to_a.join(" "))
end
Ruby解答例2
Ruby解答例1のループ部分を1行にまとめると下記のようになります。
# 解答例2
# 入力
n = gets.to_i
ary = gets.split.map(&:to_i)
# 出力
ary.each { |m| puts((1..m).to_a.join(" ")) }
Python解答例1
整数n, 数列aryを受け取り、数列aryを先頭から順に参照して、 ループ内で 1 から m までの範囲オブジェクトを生成し、アンパックして出力しています。
# 解答例1
# 入力
n = int(input())
ary = map(int, input().split())
# 出力
for m in ary:
print(*range(1, m + 1))
Python解答例2
Python解答例1のループ部分を1行にまとめると下記のようになります。
# 解答例2 # 入力 n = int(input()) ary = map(int, input().split()) # 出力 [print(range(1, m + 1)) for m in ary]
7-FINAL: 【行によって長さが違う二次元配列の表示】すべての行の長さと値が不定な 2 次元配列の出力 (paizaランク B 相当)
1行目で整数n, m 、2行目でn個の整数の数列ary_a、3行目でm個の整数の数列ary_bが与えられ、ary_a を ary_b の各要素の数で分割してそれぞれの要素を半角スペース区切りで出力する問題です。
入出力例
# 入出力例 INPUT1 = <<~"EOS" 10 4 1 2 3 4 5 6 7 8 9 10 2 6 1 1 EOS OUTPUT1 = <<~"EOS" 1 2 3 4 5 6 7 8 9 10 EOS INPUT2 = <<~"EOS" 1 1 1 1 EOS OUTPUT2 = <<~"EOS" 1 EOS
Ruby解答例1
整数n, m 配列ary_a, ary_b を受け取ります。
ary_bの先頭から順に参照し、ary_aの先頭から b個をスライスで取得して半角スペース区切りで出力し、ary_aの先頭からb個をスライスで削除します。
# 解答例1
# 入力
n, m = gets.split.map(&:to_i)
ary_a = gets.split.map(&:to_i)
ary_b = gets.split.map(&:to_i)
# ary_b の要素で繰り返し処理
ary_b.each do |b|
# ary_a の先頭から b 個分の要素を半角スペース区切りで出力
puts(ary_a[...b].join(" "))
# 出力済みの要素を削除
ary_a = ary_a[b..]
end
Ruby解答例2
整数n, m 配列ary_a, ary_b を受け取ります。
ary_bの先頭から順に参照し、shift(b)で ary_a の先頭から b個を取り出して半角スペース区切りで出力しています。
# 解答例2
# 入力
n, m = gets.split.map(&:to_i)
ary_a = gets.split.map(&:to_i)
ary_b = gets.split.map(&:to_i)
# ary_a の先頭から b 個取り出して出力
ary_b.each { |b| puts(ary_a.shift(b).join(" ")) }
Python解答例
整数n, m 配列ary_a, ary_b を受け取ります。
ary_bの先頭から順に参照し、ary_aの先頭から b個をスライスで取得して半角スペース区切りで出力し、ary_aの先頭からb個をスライスで削除します。
# 解答例
# 入力
n, m = map(int, input().split())
ary_a = list(map(int, input().split()))
ary_b = list(map(int, input().split()))
# ary_b の要素で繰り返し処理
for b in ary_b:
# ary_a の先頭から b 個分の要素を半角スペース区切りで出力
print(*ary_a[:b])
# 出力済みの要素を削除
ary_a = ary_a[b:]
今回のまとめ
Ruby, Python 共に、通常の二次元配列と同様の手順で、行によって長さが違う二次元配列を生成・出力することが出来ます。

セクション7では要素の長さが異なる二次元配列を扱いました。
次のセクションは小数点数の丸めと0埋めの問題です!