はじめに
この記事は以下のruby初学者を想定しております
・rubyを使い始めて配列や繰り返し処理、ハッシュなどの概念を理解しているかた。
・paizaやAtcoderなどの競技プログラミングに興味があるけど問題で与えられた数値の適切な取り込み方がわからないかた。
私もはじめ与えられた数値が適切に取得できずに苦労したのでまとめを残しておきます。
##1次元の数値の取り込み
###整数一つの場合
10
という数値が与えられてそれを取得する場合は
N = gets.to_i
puts N
10 :入力値
10 :出力値
上記のコンソール画面のように10を入力して10が出力されるはずです。
###一列で複数の整数が与えられる場合
1 2 3 … s
上記のような数値間に半角スペースが数列を入力する場合は数列で取り込むのが簡単なやり方です。
N = gets.chomp.split.map(&:to_i)
puts N
1 2 3 4 5 :入力値
1 :出力値
2
3
4
5
コードの説明の説明をすると
chompは文字列の末尾の改行文字を取り除いた新しい文字列を返します。(これがないと半角スペースによる改行判定で先頭1文字しか入力できなくなってしまいます。)
splitは文字列を分割し、配列を返すメソッドです。
map(&:to_i)はおなじみの繰り返しメソッドですが末尾に(&:to_i)を宣言することでinteger 型で入力値を読み込めます。
配列を出力する場合、putsを用いると1文字ごとに改行して出力することに注意してください。
##2次元の数値の取り込み
N K Q :N K Qは全て整数
A1
A2
.
.
.
AQ :Aの横の数字はQ番目の数値という意味
上記のように一列目を取り込んだ後に、
1行ごとにQ個の数を入力する場合はやり方としては
N, K, Q = gets.chomp.split.map(&:to_i)
A = Q.times.map { gets.to_i }
puts A
6 3 4 :入力値
3
1
3
2
3 :出力値
1
3
2
これらの組み合わせができればある程度の問題までは対応できました。
文字列に関しても to_i を to_s に変えれば大丈夫です。
##その他のテクニック(sortを使った並べ替え)
最後に使えると便利な小技として並べ替え(sort)の紹介をしたいと思います。
5 4 7 11 9 2 42 1
入力値として上記の数字の列を与えられて小さい順や大きい順に並べ替えたい時sortのメソッドを使うと便利です。(知らずに苦労してた時期も私にはありました。笑)
N = gets.chomp.split.map(&:to_i)
N.sort!
p N
N..sort! {|a, b| b <=> a }
p N
5 4 7 11 9 2 42 1 :入力値
[1, 2, 4, 5, 7, 9, 11, 42] :出力値
[42, 11, 9, 7, 5, 4, 2, 1]
コンソールを見てみると
1回目の出力で小さい順に並んでいて
2回目の出力で大きい順に並んでいます。
これらのテクを使えば競プロの簡単な問題は解けるようになるはずです。
私も競技プログラミング初心者ですが、一緒に頑張っていきましょう。