0
0

paizaラーニング解答: データセット選択メニュー[Ruby]

Posted at

データセット選択メニュー

この問題集にチャレンジする前にハッシュ(辞書)と集合について学んでおくことをお勧めします。

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)ですが処理時間は問題ありませんでした。

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