今回は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埋めの問題です!