0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 3 years have passed since last update.

[Ruby] AtCoder Beginner Contest 205 B問題

Posted at

##はじめに
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?メソッドは大きな収穫です!

0
0
4

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?