データセット選択メニュー
この問題集にチャレンジする前にハッシュ(辞書)と集合について学んでおくことをお勧めします。
STEP: 1 ランダムアクセス
n, m = gets.split.map(&:to_i)
a = gets.split.map(&:to_i)
puts a[m - 1]
STEP: 2 複数回のランダムアクセス
n = gets.to_i
a = gets.split.map(&:to_i)
q = gets.to_i
b = gets.split.map(&:to_i)
b.each do |i|
puts a[i - 1]
end
STEP: 3 最大値と最小値
a, b, c = gets.split.map(&:to_i)
puts [a, b, c].max - [a, b, c].min
FINAL問題 動的配列
n, q = gets.split.map(&:to_i)
a = gets.split.map(&:to_i)
q.times do
query = gets.split.map(&:to_i)
if query[0] == 0
a << query[1]
elsif query[0] == 1
a.pop
else
puts a.join(' ')
end
end
STEP: 1 とても大きな数値の入力
puts gets.chomp
文字列型で処理しています。
STEP: 2 とても小さな数値の入力
puts gets.chomp
FINAL問題 文字列の配列
h, w, r, c = gets.split.map(&:to_i)
maze = []
h.times { maze << gets.chomp.split('') }
if maze[r - 1][c - 1] == "#"
puts "Yes"
else
puts "No"
end
迷路の2次元配列mazeを作って処理。
STEP: 1 数値の出現率
n = gets.to_i
counters = {}
(0..9).each do |i|
counters[i] = 0
end
array = gets.split.map(&:to_i)
array.each do |i|
counters[i] += 1
end
puts counters.values.join(' ')
今回はハッシュで処理しました。
STEP: 2 英小文字の出現率
n = gets.to_i
s = gets.chomp
# デフォルト値0でハッシュを作成することでsに含まれない文字はカウント0になる
count = Hash.new(0)
s.each_char do |char|
count[char] += 1
end
puts ('a'..'z').map { |char| count[char] }.join(' ')
STEP: 3 文字列の出現率
n = gets.to_i
count = Hash.new(0)
n.times do
s = gets.chomp
count[s] += 1
end
# ハッシュをsortすることで二次元配列になる
count = count.sort
count.each do |s, a|
puts "#{s} #{a}"
end
STEP: 4 価格の算出
n, m = gets.split.map(&:to_i)
hash = Hash.new(-1)
n.times do
a, b = gets.chomp.split
hash[a] = b
end
m.times do
s = gets.chomp
puts hash[s]
end
FINAL問題 商品の検索
n, q = gets.split.map(&:to_i)
hash = Hash.new(-1)
(1..n).each do |i|
s = gets.chomp
unless hash.key?(s)
hash[s] = i
end
end
q.times do
t = gets.chomp
puts hash[t]
end
ポイントはunlessでハッシュに登録するか否かのルールを考えること。
STEP: 1 集合の探索
n, b = gets.split.map(&:to_i)
a = gets.split.map(&:to_i)
puts a.include?(b) ? "Yes" : "No"
シンプルな式なら三項演算で分かりやすく。
STEP: 2 重複の削除
n = gets.to_i
a = gets.split.map(&:to_i)
puts a.uniq.join(' ')
STEP: 3 重複の判定 1
n = gets.to_i
a = gets.split.map(&:to_i)
array = [a[0]]
(1...n).each do |i|
puts array.include?(a[i]) ? "Yes" : "No"
array << a[i]
end
STEP: 4 重複の判定 2
n = gets.to_i
a = gets.chomp.split
array = [a[0]]
(1...n).each do |i|
puts array.include?(a[i]) ? "Yes" : "No"
array << a[i]
end
FINAL問題 集合の結合
n = gets.to_i
a = gets.split.map(&:to_i)
b = gets.split.map(&:to_i)
puts (a + b).uniq.sort.join(' ')
1 ≦ A_i, B_i ≦ 1,000,000,000 (1 ≦ i ≦ N)ですが処理時間は問題ありませんでした。