ham-capのブログ

プログラミング学習の記録

【Ruby素振り】AtCoder過去問 355B - Piano 2

Ruby素振り?

AtCoder Problemsの過去問でAB問題をRubyを使用してひたすら解いていくことを個人的にRuby素振りと名付けて取り組んでいます。

せっかくなので、苦戦したものや勉強になったものをブログに載せていきます。

Rubyを手に馴染ませるというのが主目的なので、競プロっぽい変態的な効率的な書き方を追い求めることはしません。

百人組手的なスタンスなので、あまり綺麗な解法ではないことが多いです。

飽きたらやめます。

今日の問題

atcoder.jp

問題文

長さNの数列A=(A1,A2,…,AN) と、長さM の数列B=(B1,B2,…,BM) が与えられます。ここで、A,B のすべての要素は互いに相異なります。A,B のすべての要素を昇順に並べた長さN+M の数列C=(C1,C2,…,CN+M) において、A に現れる要素が2つ連続するかどうか判定してください。

制約

  • 1≤N,M≤100
  • 1≤Ai,Bj≤200
  • A1,…,AN,B1,…,BM は相異なる
  • 入力はすべて整数

入力

入力は以下の形式で標準入力から与えられる。

N M
A1 A2 … AN
​B1 B2 … BM

入力例

3 2
3 2 5
4 1

出力

A に現れる要素がC において2つ連続するならば Yes を、そうでないなら No を出力せよ。

解法

n, m = gets.chomp.split.map(&:to_i)
a = gets.chomp.split.map(&:to_i)
b = gets.chomp.split.map(&:to_i)
c = (a + b).sort
positions = []

c.each_with_index do |num, idx|
  positions << idx if a.include?(num)
end

ans = []

positions.each_with_index do |pos, idx|
  break if idx == n - 1

  if positions[idx + 1] - pos == 1
    ans << true
    break
  else
    ans << false
  end
end

puts ans.any? ? 'Yes' : 'No'

感想

なんか愚直解で満足しちゃってる感じがして釈然としない。 Rubyのメソッドにしても、手持ちの駒でやりくりしている感が漂っているので、馴染みのないメソッドを積極的に使っていきたい。