LoginSignup
0
0

More than 1 year has passed since last update.

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

Last updated at Posted at 2023-04-28

はじめに

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

A - A Recursive Function

a-273.rb
def f(k)
- f = 1
- f = k * f(k - 1) if k != 0
- f
+ (1..k).inject(1, :*)
end

n = gets.to_i
puts f(n)

解説

再帰関数を定義することで実装することができます。

B - Broken Rounding

b-273.rb
# 修正前
x, k = gets.split.map(&:to_i)
k.times do |i|
  x = x.round(-i - 1)
end
puts x
b-273.rb
# 修正後
x, k = gets.split.map(&:to_i)
puts k.times.inject(x){ |result, i| result.round(-i - 1) }

解説

i(0<=i<=k-1)について順次四捨五入していくことで実装することができます。

C - (K+1)-th Largest Number

c-273.rb
n = gets.to_i
a = gets.split.map(&:to_i)

b = a.sort.uniq
l = b.size
hash = Hash.new(0)
n.times do |i|
  index = b.bsearch_index { |x| x > a[i] } || l
  hash[l - index] += 1
end

n.times do |k|
  puts hash[k]
end

他の方の提出結果を参考にしたところtallyメソッドを使って解くこともできるようです。こちらの方が高速で直感的に分かりやすいです。

別解
n = gets.to_i
a = gets.split.map(&:to_i)

hash = {}
l = a.uniq.size
- a.sort.uniq.each_with_index do |factor, index|
+ a.uniq.sort.each_with_index do |factor, index|
  hash[l - 1 - index] = factor
end

a = a.tally
n.times do |k|
  puts a[hash[k]] || 0
end

解説

最初のコードでは、bsearch_indexメソッドを使ってa[i]よりも大きくなるインデックスを取得し連想配列を更新しています。

0
0
4

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