日別アーカイブ: 2022年8月17日

paizaLvアップ問題と解答(標準出力17)Ruby

※スキルチェック問題ではありません。
規約により公式の解答コードそのままはよろしくないので、
オリジナルのコードにしています。

詳しくはコチラ

なるべくわかりやすい解説を付けました。

FINAL問題 行によって長さが違う二次元配列の表示】すべての行の長さと値が不定な 2 次元配列の出力 (paizaランク B 相当)

自然数 N, M と N 個の自然数からなる数列 A と M 個の自然数からなる数列 B が与えられます。1 行目には数列 A の最初の B_1 個の値を出力し、 2 行目にはその次から B_2 個の値を出力します。このように、i 行目には数列 A の 1 + B_1 + B_2 + … + B_{i – 1} 番目の値から B_i 個の値を出力してください。言い換えると、数列 A の値を B_1 個、B_2個、… B_M 個で分割し、それぞれの数列を改行区切りで出力してください。

入力される値
N M
A_1 A_2 A_3 ... A_N
B_1 B_2 B_3 ... B_M

入力値最終行の末尾に改行が1つ入ります。

文字列は標準入力から渡されます。

期待する出力
答えの数値を出力してください。

A_1 ... A_{B_1}
A_{B_1+1} ... A_{B_1+B_2-1}
A_{B_1+B_2} ... A_{B_1+B_2+B_3-1}
...
A_{B_1+...+B_{M-1}} ... A_{B_1+B_2+...+B_M}

末尾に改行を入れ、余計な文字、空行を含んではいけません。

条件
すべてのテストケースにおいて、以下の条件をみたします。

* N, Mは 1 以上 100 以下
* M ≦ N
* A, Bの各要素の値は 1 以上 100 以下
* B_1 + B_2 + B_3 + … + B_M = N

入力例1
10 4
1 2 3 4 5 6 7 8 9 10
2 6 1 1
出力例1
1 2
3 4 5 6 7 8
9
10
入力例2
1 1
1
1
出力例2
1

解答 (入力例1で解説)

# 1行目の半角スペース刻みの入力値を各変数に代入
n,m = gets.split.map(&:to_i)

# 2行目の半角スペース刻みの入力値を配列として変数に代入
numbers = gets.split.map(&:to_i)

# 3行目の半角スペース刻みの入力値を配列として定数に代入
B = gets.split.map(&:to_i)

#変数に初期値を代入(理由は後述)
count = 0

#m回繰り返す
m.times do |i|
  
# 計算しやすいように変数に代入する(やらなくてもOK)
  x = B[i]

#  配列のnumbersの出力範囲をきめて出力する(このとき半角スペースを間に挟む)
#※解説は後述
    puts numbers[count..(count + x - 1)].join(' ')
  
# countにxを加算することで次のループの最初の地点を設定する
  count += x

end

※ポイント

iは0からはじまる

1回目のループ

puts numbers[count..(count + x – 1)].join(‘ ‘)

puts numbers[0..1].join(‘ ‘)となるので

1 2が出力されて

count に 2が加算され2になる(B[0] = 2 なので)

2回目のループ

puts numbers[count..(count + x – 1)].join(‘ ‘)

puts numbers[2..7].join(‘ ‘)となるので

3 4 5 6 7 8が出力されて

count に 6が加算され8になる(B[1] = 6 なので)

3回目のループ

puts numbers[count..(count + x – 1)].join(‘ ‘)

puts numbers[8..8].join(‘ ‘)となるので

9が出力されて

count に 1が加算され9になる(B[2] = 1 なので)

4回目のループ

puts numbers[count..(count + x – 1)].join(‘ ‘)

puts numbers[9..9].join(‘ ‘)となるので

10が出力されて

count に 1が加算され10になる(B[3] = 1 なので)