日別アーカイブ: 2022年8月12日

paizaLvアップ問題と解答(標準出力12)Ruby

※スキルチェック問題ではありません。
規約により公式の解答コードそのままはよろしくないので、
オリジナルのコードにしています。

詳しくはコチラ

なるべくわかりやすい解説を付けました。

FINAL問題【特定の文字で区切り 1 行で出力】大きな数値を 3 けたごとにカンマ区切りで出力 2 (paizaランク C 相当)

大きな数値Nが入力されます。 位の小さい方から 3 けたごとにカンマ区切りで出力してください。
ただし、Nのけた数は 3 の倍数とは限りません。

入力される値
N

入力値最終行の末尾に改行が1つ入ります。

文字列は標準入力から渡されます。

期待する出力
答えの数値を出力してください。

M

末尾に改行を入れ、余計な文字、空行を含んではいけません。

条件
すべてのテストケースにおいて、以下の条件をみたします。

* Nは自然数
* Nは 0 以上 10 ^ 1,000 以下

入力例1
123456789
出力例1
123,456,789
入力例2
813
出力例2
813
入力例3
12345678901234567890
出力例3
12,345,678,901,234,567,890

解答 (入力例3で解説)

#↓入力値を文字列として受け取りバラバラにして反転する(gets.chars.reverse)
#["0", "9", "8", "7", "6", "5", "4", "3", "2", "1", "0", "9", "8", "7", "6", "5", "4", "3", "2", "1"]
numbers = gets.chars.reverse

#配列の長さの回数分繰り返す(20回) 
numbers.size.times do |i|

#3の倍数かつループの最後以外の時 
  if (i + 1) % 3 == 0 && i + 1 != numbers.size

#,(カンマ)を挿入する 
    numbers[i] << ','
  end
end
#繋げて反転して出力する
puts numbers.join.reverse

※ポイント

①入力値が3桁の倍数の桁ではないことに注意する

文字列として受け取りバラバラにしてから反転(numbers = gets.chars.reverse)

カンマを挿入していくことでどの桁でも対応をすることができる。

②あとは問題5と同じやり方をしてから最後にまた反転してもとに戻せば良い

#繋げて反転して出力する puts numbers.join.reverse

numbers[i] << ‘,’の意味

配列[ 1 , 2 ] << 3   は   配列[1,2,3]となるので

配列の3の倍数のあとに,(カンマ)を挿入しているよ