はじめに
AtCoderを始めたので、自分用の整理、メモとして投稿します。
間違えている箇所があれば指摘して下さると幸いです!!!!!!!!!!!!
1つの要素を取得
A = gets.chomp
p A
例: 1を入力
-標準入力-
1
-出力-
"1"
・chompメソッドは文字列末尾の改行文字 \n を削除するメソッド。
・getsメソッドで入力した値は、文字列(Stringクラス)で返される。数値(Integerクラス)として扱いたい場合は、to_iメソッドを使う。 to_iメソッドは 「整数と見なせない文字があればそこまでを変換対象とする」 ため、改行文字 \n は変換対象になる。ゆえに、chompメソッドは不要。
A = gets.to_i
B = gets
p A
p B
例: Aに1、Bに2を入力
-標準入力-
1
2
-出力-
1
"2\n"
1行の複数の要素を取得
A = gets.spilt(" ")
p A
例: 1 2 3 を入力
-標準入力-
1 2 3
-出力-
["1", "2", "3"]
・splitメソッドは引数に従って、文字列を分割し、分割された文字列を要素とする配列をつくる。今回は空白ごとに分割している。引数を指定しない場合は、デフォルトで空白で分割する。
・split(" ")のとき(引数を指定しないとき)、先頭と末尾の空白を除いたうえで、空白で分割する。また、入力した文字列末尾の改行文字 \n は空白と見なせるから、ここではchompメソッドは不要。
!!!配列の要素を数値(Integerクラス)にしたいとき!!!
配列(arrayクラス)に、to_iメソッドは使えない!!!この場合はmapメソッドを使う。
-mapメソッド-
ブロック内の処理を配列の要素それぞれに行い、その結果を返すメソッドのこと。
A = gets.spilt.map{|n| n.to_i}
p A
-標準入力-
1 2 3
-出力-
[1, 2, 3]
ちなみに、下記のように省略できる。
A = gets.spilt.map(&:to_i)
p A
二次元配列
H行、W列の行列を扱う問題で用いる。
例: 3行3列の行列
H, W = gets.split.map(&:to_i)
A = Array.new(H) {gets.split.map(&:to_i)}
p A
-標準入力-
3 3
1 2 3
4 5 6
7 8 9
-出力-
[[1, 2, 3], [4, 5, 6], [7, 8, 9]]
・A = Array.new(size) で要素の数を指定して、新しい配列Aを作成している。また、{ }内の処理を配列の各要素に行っている。Array.new(size) { } という記法なため、mapメソッドは不要。
ちなみに、下記のようにすると
H, W = gets.split.map(&:to_i)
A = Array.new(H) {gets.split.map(&:to_i)}
A.each{|row| puts row.join(" ")}
-標準入力-
3 3
1 2 3
4 5 6
7 8 9
-出力-
1 2 3
4 5 6
7 8 9
・joinメソッドは、配列の要素を引数で結合して、1つの文字列をつくるメソッド。今回は配列Aの要素である配列の要素(配列Aの要素[1,2,3]の要素)を空白で結合している。
!!!!個人的には3行目の puts がポイント!!!!
p、print、putsメソッドそれぞれの出力後の改行について
-pメソッド-
出力後に改行される
-printメソッド-
出力後に改行されない
-pメソッド-
出力後に改行される
a = 1
p a
print a
puts a
-出力-
1
11
これらのことから、putsであるから綺麗な行列として出力されるといえる。
おわりに
実はQiita初投稿です~てへへ
少しでも誰かのお役に立てれば嬉しいです!!
今後もRubyや競プロについて投稿していこうと思います。