日別アーカイブ: 2022年10月25日

TIPS(Ruby:配列を降順にする・1の位を取得する)

問題

Rubyで配列を降順にするには?

#降順にする

a = [0,9,4,5]

a = a.sort_by { |n| n }.reverse

#実行結果

[9, 5, 4, 0]

問題

Rubyで配列の中で加算しながら1の位を取得する

入力値

62 89

期待する出力

8
7

コードと解説 (入力例1で解説)

#1行目の半角スペース刻みの入力値を文字列として各変数に代入
n, m = gets.split

#n = ["62"] → ["6","2"]→ [6,2]→ [8] → [8] → 8 
n.chars.map(&:to_i).sum.digits.take(1).pop

#m = ["89"] → ["8","9"]→ [8,9]→ [17] → [7] → 7 
m.chars.map(&:to_i).sum.digits.take(1).pop

1:.charsで文字列をバラバラにする[’89’] → [‘8′,’9’]
2:.map(&:to_i)で文字列を数字に変える[‘8′,’9’]→ [8,9]
3:.sumで配列の中身の数字を合計する[8,9]→[17]
4:.digits.take(1)で1の位を取り出す[17]→[7]
5:.popで配列から取り出す[7] → 7

問題

配列内の数字が続いている時グループ化して最小を足し合わせる

8 10 11 12 21 22の場合

[[8], [10, 11, 12], [21, 22]]←このようにして各配列の最小の値を足し合わせる

入力値

6 
8 10 11 12 21 22

期待する出力

39

コードと解説 .chunk_whileを使えば楽にできる

#空の配列で初期化する
answer = []

#1行目の入力値(数値)を変数に代入する
n = gets.to_i

#2行目の半角スペース刻みの入力値を配列に代入してから昇順に並び替える
a = gets.split.map(&:to_i).sort

group = a.chunk_while {|i, j| i + 1 == j }.to_a

#配列の長さで繰り返す
group.size.times do |i|
  #各配列の最小値を配列に挿入する
  answer << group[i].min
end
puts answer.sum

※ポイント

group = a.chunk_while {|i, j| i + 1 == j }.to_a
#実行結果[[8], [10, 11, 12], [21, 22]]

あとは各配列の最小値を.minで取り出して配列に挿入していき
最終的に配列answerを.sumで総和を出すことでできる。