##はじめに
AtCoderの過去問にハマってしまいました 笑
今回はAtCoder Beginner Contest 205 B問題**「B - Permutation Check」**にRubyで挑戦です!よろしくお願いします。
問題文は下記リンクから飛んで確認してください。
##問題 B - Permutation Check
まずは入力を受け取る記述です。
n = gets.to_i
a = gets.split.map(&:to_i)
正直のところ、入力値の受け取り方からかなり苦労してます。
慣れみたいなところはあるのでしょうが、まだまだ記述に困ってしまいます。
入力を受け取る記述ができたらまず、空の配列を作ります。
受け取った、nの数字分1からこの配列に入れていきます。
例えばnが6だったら、1, 2, 3, 4, 5, 6 という配列が欲しいので、その配列を作成するための記述を書いていきます。
n = gets.to_i
a = gets.split.map(&:to_i)
ary =[]
n.times do |nn|
ary << nn + 1
end
ブロック変数の名前が思いつかなくて、めちゃくちゃ悪い例だと思います。。。
こういう時のわかりやすい名前の付け方とかあればぜひコメントにて教えていただけると幸いです。
nn + 1 としているのは、もし+ 1していないと、0 ~ 5になってしまうからです。(配列は添字で要素を管理しているため)
ここまでくれば、あとはこの配列aryの中の数字が、aの中の数字と一致しているか(順番は関係ない)を調べて、全て一致していればYesを出して、一つでも違えばNoを出力してやれれば完成です。
n = gets.to_i
a = gets.split.map(&:to_i)
ary =[]
n.times do |nn|
ary << nn + 1
end
if ary.all? { |i| a.include?(i) }
puts "Yes"
else
puts "No"
end
これで完成です。ポイントはこのall?メソッド。
このall?メソッドとinclude?メソッドの組み合わせを見つけるのに苦労しました。
##おまけ
all?メソッドの使い方を説明します。まず、書き方は下記のとおりです。
オブジェクト.all? { |要素| ブロック処理 }
all?メソッドは配列の中身を全て取り出し、ブロック変数に一つずつ入れていきます。そして、{}のなかに書かれている処理の返り値が全て真の時にtrueを返すメソッドです。
include?メソッドは()の中の要素が、配列の中にあるかを調べ、存在すればtrueを返します。
つまり、先ほどの回答の記述は、all?メソッドで配列aryの中の要素全てがブロック変数iに一つずつ代入され、include?メソッドの()の中に入ることによって、変数aの中に、aryから取り出した要素があるかどうかを調べています。
そして、全てのaryの要素が配列aの中に存在すると判断されればall?メソッドが初めてtrueを返します。
##最後に
これまであまりアルゴリズムには触れてこなくて、初めて見るメソッドが多かったりします。何回も繰り返して使いこなしたいと思いました。
今回のall?メソッドは大きな収穫です!