技術ブログ

(技術系中心)基本自分用備忘録なので、あくまで参考程度でお願いします。

競技プログラミング day8

問題

B - Foods Loved by Everyone

回答

# ----------------------------------------------------------
# ■ 問題
# https://atcoder.jp/contests/abc118/tasks/abc118_b

# ■ 前提条件
# 1. カツサンド君はオムライスが好き
# 2. カツサンド君は明太子や寿司、クリームブリュレやテンダーロインステーキなどが好きで、これらの食べ物は全て、誰もが好きと信じている


# ■ 制約
# 1. 入力は全て整数
# 2. 1<= N, M <= 30
# 3. 1<= Ki <= M
# 4. 1<= Aij <= M
# 5. 各i(1<= i <=N)についてAi1,Ai2 ... AiKiは異なる

# ■ 流れ説明
# 1. 入力値を受け取る(N, M)
# 2. N人分ループ回す
# 3. 好きな食べ物を回答する回数(K)と好きな食べ物を回答した値(food)を入力
# 4.好きな食べ物を回答した値にプラス1する。(Hashで表す)
# 5.hash形式で表現されたものから全員が好きと答えた食べ物の数を算出してputs
# 例(key = 食べ物、value = keyの食べ物を好きと回答した人数
# {1=>2, 3=>3, 2=>2}


# ■入力例
# 3 4
# 2 1 3
# 3 1 2 3
# 2 3 2

# ■ 出力例
# 1

# ■ 工夫箇所
# K, *foods = gets.split.map(&:to_i)
# foodを可変長引数にして複数の値を代入できるようにした。
# ```
# irb(main):001:0> K, *foods = gets.split.map(&:to_i)
# 1 1 2 4 5 2 
# => [1, 1, 2, 4, 5, 2]
# irb(main):002:0> foods
# => [1, 2, 4, 5, 2]
# ```
# ----------------------------------------------------------

# 1. 入力値を受け取る(N, M)
N, M= gets.chomp.split(' ').map(&:to_i)

menu = {}
# 2. N人分ループ回す
N.times {
  # 3. 好きな食べ物を回答する回数(K)と好きな食べ物を回答した値(food)を入力
  K, *foods = gets.split.map(&:to_i)
  foods.each { |food|
    # 4.好きな食べ物を回答した値にプラス1する。
    menu[food] += 1
  }
}

# 5.hash形式で表現されたものから全員が好きと答えた食べ物の数を算出してputs
# 好きな食べ物を回答した人数が以下のようにhash形式になってる。
# 例)1を好きと回答した人は2人、3を好きと回答した人は3人,2を好きと回答した人は2人
# {1=>2, 3=>3, 2=>2}
# 回答した人全員が好きと回答した場合v == Nという関係性がある。つまり、回答者全員が好きと答えた値である。
puts menu.select{|k, v| v == N}.size