0
0

More than 1 year has passed since last update.

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

Posted at

はじめに

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

A - Nine

a-309.rb
a, b = gets.split.map(&:to_i)
puts b - a == 1 && a % 3 != 0  ? "Yes" : "No"

B - Rotate

b-309.rb
n = gets.to_i
array = Array.new(n){ gets.chomp }

ans = array.map(&:dup)
1.upto(n - 1) do |i|
  ans[0][i] = array[0][i - 1]
  ans[i][n - 1] = array[i - 1][n - 1]
end

0.upto(n - 2) do |i|
  ans[i][0] = array[i + 1][0]
  ans[n - 1][i] = array[n - 1][i + 1]
end
ans.each{ puts _1 }

解説

(他の方の提出結果を参考にしました)

dupメソッドを使ってオブジェクトの内容をクローンする必要があるみたいです(元のarrayも変わってしまうため)。

C - Medicine

c-309.rb
n, k = gets.split.map(&:to_i)

hash = Hash.new(0)
sum = 0
n.times do
  a, b = gets.split.map(&:to_i)
  hash[a + 1] += b
  sum += b
end

if sum <= k
  puts 1
  exit
end

hash.sort.each do |key, val|
  sum -= val
  if sum <= k
    puts key
    exit
  end
end

解説

連想配列hashに薬の情報を保持させておき、sumとして錠剤の数の総和をもたせておきます。そして、key(日数)でソートしたhashについてsumからval(錠剤の数)を引き、sumk以下であれば対応するkey(日数)を出力してループを抜けることで解くことができます。なお、1日目スタートであるためkeyの値は元の値よりも1多い値としています。

0
0
0

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