LoginSignup
0
0

RubyでAtCoder ABC303(A, B, C)を解いてみた

Last updated at Posted at 2023-05-28

はじめに

Webエンジニアを目指して、RubyやRailsをいじってます。
今回は、RubyでAtCoder ABC303のA, B, Cを解きました。備忘録として解き方をまとめていきたいと思います。

A - Similar String

a-303.rb
gets
s = gets.tr("01", "ol")
t = gets.tr("01", "ol")
puts s == t ? "Yes" : "No"

解説

trメソッドを使って、0をoに、1をlに置換した後のsとtが一致しているかどうかを判定すればOKです。

B - Discord

b-303.rb
n, m = gets.split.map(&:to_i)

- sum_pair = Array.new(m){ gets.split.each_cons(2).map{ |pair| pair.sort! } }.flatten.each_slice(2).uniq.size
+ sum_pair = Array.new(m){ gets.split.each_cons(2).map(&:sort!) }.flatten(1).uniq.size
- puts [*1..n].combination(2).size - sum_pair
+ puts (n * (n - 1)) / 2 - sum_pair

解説

each_consメソッドとflattenメソッドおよびeach_sliceメソッドを組み合わせることで、隣り合った人の組み合わせを求めることができます。このとき求める答えは、(1..n)から2つ選んでできる組み合わせの数から先ほどの隣り合ったことのある人の組み合わせの数を差し引いた値となります。

C - Dash

c-303.rb
n, m , h , k = gets.split.map(&:to_i)
s = gets.chomp.chars
hash = {}
m.times do
  x, y = gets.split.map(&:to_i)
  hash[[x, y]] = true
end

nx = ny = 0
s.each do |c|
  h -= 1
  break if h < 0

  case c
  when "R"
    nx += 1
  when "L"
    nx -= 1
  when "U"
    ny += 1
  when "D"
    ny -= 1
  end

  if h < k && hash[[nx, ny]]
    hash[[nx, ny]] = false
    h = k
  end
end
puts h >= 0 ? "Yes" : "No"

解説

連想配列を使って、問題文の通りに実装することで高橋くんが倒れることなくN回の移動ができるかどうかを判定することができます。

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