0
0

More than 1 year has passed since last update.

[Ruby] AtCoder過去問 B - Foods Loved by Everyone

Posted at

はじめに

AtCoder過去問のB問題をRubyで解いてみました。
よろしくお願いします。

問題はこちらから確認してください。↓

B - Foods Loved by Everyone

はじめに入力を受け取ります。

n, m = gets.split.map(&:to_i)
a = readlines(chomp: true).map{|line| line.split(' ').map(&:to_i)}

2行目は二次元配列で受け取っています。入力例1を例にすると
[[2, 1, 3], [3, 1, 2, 3], [2, 3, 2]]
といったように受け取ります。

配列aの中のそれぞれの配列の先頭(インデックスで0番目)の数字は好きな食べ物の数を表しているだけです。好きな食べ物を表しているわけではないので、邪魔になります。消しましょう。

n, m = gets.split.map(&:to_i)
a = readlines(chomp: true).map{|line| line.split(' ').map(&:to_i)}

a.each do |i|
  i.delete_at(0)
end

これでそれぞれの先頭の数を消せました。入力例1では現在aは下記のようになっているでしょう。

[[1, 3], [1, 2, 3], [3, 2]]

続いて、この配列aの中身を一つに結合したいです。
flattenメソッドを使って一次元配列にします。

n, m = gets.split.map(&:to_i)
a = readlines(chomp: true).map{|line| line.split(' ').map(&:to_i)}

a.each do |i|
  i.delete_at(0)
end

flat_a = a.flatten

これで一次元にできました。
入力例1でいえばflat_aは下記のようになっているでしょう。

[1, 3, 1, 2, 3, 3, 2]

あとは1~mの数字がそれぞれがこの配列の中に何個あるかを調べます。そしてその個数と人数が同じだったら全ての人が好きであるということなのでその場合、変数ansに+1します。
最後にansを出力して完成です。

n, m = gets.split.map(&:to_i)
a = readlines(chomp: true).map{|line| line.split(' ').map(&:to_i)}

a.each do |i|
  i.delete_at(0)
end

flat_a = a.flatten

cnt = 0

(1..m).each do|j|
  if flat_a.count(j) == n
    cnt +=1
  end
end

puts cnt
0
0
2

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