paiza プログラミング

[Ruby|Python]paiza 標準出力メニュー 【行によって長さが違う二次元配列の表示】

paiza_stdout_7

今回はpaiza 標準入力メニューセクション7【行によって長さが違う二次元配列の表示】を解説します。

セクション7は、長さが異なる二次元配列(ジャグ配列)を生成し、出力する問題です。

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

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

セクション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_n1 から 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_n1 から 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埋めの問題です!



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


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






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







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







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







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


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

© 2024 じゃいごテック