今回はpaiza 標準入力メニューセクション10(行列の入力)を解説します。
セクション10は、行数n、列数mが与えられ、続くn行、半角スペース区切りの要素数m個の二次元配列データを受け取る問題です。
本記事で使用しているメソッドについて
解答例で使っているメソッドについて、下記の記事で詳しく解説していますので参考にしてみて下さい。
- [Ruby] 標準入力によるデータ取得1
- [Ruby] 標準入力によるデータ取得2
- [Ruby] 標準入力によるデータ取得3
- [Ruby] 標準出力(データを任意に整形して出力する)
- [Ruby]配列の基本操作1
- [Ruby]繰り返し処理
セクション10:【N 行 M 列のデータの入力】行ごとに要素数の異なる整数列の入力 (paizaランク D 相当)
10-STEP1: 3 行 3 列の整数の入力 (paizaランク D 相当)
3行で各行が半角スペースで区切られた3個のデータを整数型で受け取る問題です。
入出力例
# 入出力例 INPUT1 = <<~"EOS" 8 1 3 1 2 3 3 1 8 EOS OUTPUT1 = <<~"EOS" 8 1 3 1 2 3 3 1 8 EOS
Ruby解答例1
入力ではh.times
で3回のループを設定し、.map{ gets.split.map(&:to_i) }
で各行を半角スペースで分割し整数型に変換して配列aryに追加しています。
出力はary.map { 各行の処理 }.join("\n")で各行を改行で連結した文字列に変換しており、各行の処理はrow.join(" ")
で各要素を半角スペースで連結しています。
# 解答例1 h = 3 # 入力 ary = h.times.map { gets.split.map(&:to_i) } # 出力 puts(ary.map { |row| row.join(" ") }.join("\n"))
Ruby解答例2
解答例1の処理を少し分割して書くと次のようになります。
# 解答例2 h = 3 # 入力 ary = [] h.times do # 1行分の要素を半角スペースで分割 row = gets.split.map(&:to_i) # ary に追加 ary.push(row) end # 出力 ary.each do |row| puts(row.join(" ")) end
Python解答例
# 解答例 h = 3 # 入力 ary = [[*map(int, input().split())] for _ in range(h)] # 出力 [print(*row) for row in ary]
10-STEP2: N 行 3 列の整数の入力 (paizaランク D 相当)
1行目で行数nが与えられ、続くn行で各行が半角スペースで区切られた3個のデータを整数型で受け取る問題です。
入出力例
# 入出力例 INPUT1 = <<~"EOS" 2 1 2 3 8 1 3 EOS OUTPUT1 = <<~"EOS" 1 2 3 8 1 3 EOS
Ruby解答例
1行目で行数nを受け取れば、あとはSTEP1と同じコードです。
# 解答例 # 1 行目入力 n = gets.to_i # 続く n 行入力 ary = n.times.map { gets.split.map(&:to_i) } # 出力 puts(ary.map { |row| row.join(" ") }.join("\n"))
Python解答例
# 解答例 # 1 行目入力 n = int(input()) # 続く n 行入力 ary = [[*map(int, input().split())] for _ in range(n)] # 出力 [print(*row) for row in ary]
10-STEP3: 3 行 M 列の整数の入力 (paizaランク D 相当)
1行目で列数mが与えられ、続く3行で各行が半角スペースで区切られたm個のデータを整数型で受け取る問題です。
入出力例
# 入出力例 INPUT1 = <<~"EOS" 5 1 2 3 4 5 8 1 3 8 1 813 138 381 183 831 EOS OUTPUT1 = <<~"EOS" 1 2 3 4 5 8 1 3 8 1 813 138 381 183 831 EOS
Ruby解答例
行数n=3で固定なので、1行目で列数mを受け取れば、あとはSTEP1と同じコードです。
なお、列数mを受け取っていますが、その後の処理で使われていません。
# 解答例 n = 3 # 1 行目入力 m = gets.to_i # 続く n 行入力 ary = n.times.map { gets.split.map(&:to_i) } # 出力 puts(ary.map { |row| row.join(" ") }.join("\n"))
Python解答例
# 解答例 n = 3 # 1 行目入力 m = int(input()) # 続く n 行入力 ary = [[*map(int, input().split())] for _ in range(n)] # 出力 [print(*row) for row in ary]
10-STEP4: N 行 M 列の整数の入力 (paizaランク D 相当)
1行目で行数n, 列数mが半角スペース区切りで与えられ、続くn行で各行が半角スペースで区切られたm個のデータを整数型で受け取る問題です。
入出力例
# 入出力例 INPUT1 = <<~"EOS" 2 3 1 2 3 8 1 3 EOS OUTPUT1 = <<~"EOS" 1 2 3 8 1 3 EOS
Ruby解答例
1行目で行数n, 列数mを受け取れば、あとはSTEP1と同じコードです。
STEP3と同様、列数mを受け取っていますが、その後の処理で使われていません。
# 解答例 # 1 行目入力 n, m = gets.split.map(&:to_i) # 続く n 行入力 ary = n.times.map { gets.split.map(&:to_i) } # 出力 puts(ary.map { |row| row.join(" ") }.join("\n"))
Python解答例
# 解答例 # 1 行目入力 n, m = map(int, input().split()) # 続く n 行入力 ary = [[*map(int, input().split())] for _ in range(n)] # 出力 [print(*row) for row in ary]
10-FINAL: 【N 行 M 列のデータの入力】行ごとに要素数の異なる整数列の入力 (paizaランク D 相当)
1行目で行数nが与えられ、続くn行の半角スペース区切りデータの2個目以降の要素を整数型の配列変換して受け取る問題です。
※ 2行目以降の1個目の要素は各行の要素数mですが、今までの問題から使用しないことがわかっています。
入出力例
# 入出力例 INPUT1 = <<~"EOS" 3 1 8 2 8 1 3 8 1 3 EOS OUTPUT1 = <<~"EOS" 8 8 1 8 1 3 EOS
Ruby解答例
1行目でデータ数nを受け取ります。
続くn行では半角スペースで要素を分割し、2個目以降の要素を整数型に変換した配列に変換して配列aryに追加します。
# 解答例 # 1 行目入力 n = gets.to_i # 続く n 行入力 ary = n.times.map { gets.split[1..].map(&:to_i) } # 出力 puts(ary.map { |row| row.join(" ") }.join("\n"))
Python解答例
# 解答例 # 1 行目入力 n = int(input()) # 続く n 行入力 ary = [[*map(int, input().split()[1:])] for _ in range(n)] # 出力 [print(*row) for row in ary]
今回のまとめ
N行M列で、各行が半角スペースで区切られた入力データを受け取るときは、行数Nのループを設定し、各行を半角スペースで分割し、配列に追加していく。
このとき、列数Mが分からなくてもデータを受け取ることができる。
色々なパターンのデータ受け取りがありましたが、共通コードで解ける問題が多かったですね。