ぼくらの研究

ぼくらのための研究をしていきます。

Paiza 複数行データの標準入力の取得を分かりやすく説明する

      2018/02/04

Paizaの問題でよくある「複数行のデータの標準入力の取得」についてなるべく分かりやすく説明したいと思います。

最初は意味不明でした。標準入力に馴染みのないぼくは問題を解いている最中、

「え、このデータは何なの?型は何?1行目のデータしかとれないんだけど。何なの?文字列データではあるっぽいけど……でもgetsをどんだけ調べてもこねくりまわしても、全部のデータがとれないんだけど。なんで?配列でもないしsplitとかで分解できもしないし、そもそもlengthも入力例のデータ長とあってないし、いったい何なの?これ」

といった感じで困惑しきりでした。

結論から言うと、gets(複数行データの標準入力)は行毎にデータが区切れていて、1回の取得で全データを取得することはできず、N回目の取得でN行目が取得される形になっています。

つまりデータを取得する度に取得データが変わるのです。

1回しか取得しなければ、1行目のデータしか取得できません。ここが他の普通のデータ型しか扱ったことがない身からすると混乱するポイントでした。

例えばこのRubyの以下のコード。


input = gets
p input
input = gets
p input
input = gets
p input

プログラミングしていれば違和感を感じると思います。

「いや同じ結果何回も出力してるだけやんけ」

と。これがいかに不自然で無駄な繰り返しかはすぐ分かると思うのですが、こと標準入力においては違います。

上の例でいえば、もし仮にgetsが3行のデータで構成されていた場合、1回目、2回目、3回目、それぞれgetsからの取得値が異なり、結果出力も異なるのです。

 

ここで、Paizaで紹介している標準入力から複数行データを読み込む基本形のサンプルコード(Ruby)を紹介しておきます。

 

標準入力から複数行データを読み込む基本形


# 標準入力とループ処理

count = gets.to_i
puts("データ個数 #{count}")

for i in 1..count
line = gets
puts "hello #{line}"
end

引用元:https://paiza.jp/works/ruby/primerfemale/beginner-ruby3-female/3027

 

それと、よくあるパターンとして1行目に取得対象のデータ数(行数)を表す整数があって、2行目以降に取得対象のデータを変数arrayに配列として取り組む場合があると思うのでその場合のコードも参考に書いておきます。

 

以上、参考になれば幸いです。