こんにちは!じゃいごテックのあつしです。
今回はpaiza Bランクレベルアップメニュー から5以上の整数の合計という問題を解説します。
この問題集は繰り返しと条件分岐に関する5個のSTEP問題(D級)とFINAL問題(C級)で構成されていて、STEP問題を解いて行けばFINAL問題も解けるはず!となっています。
STEP問題を解いてみる
STEP問題は繰り返しと条件分岐の基本問題です。
簡単な解説は付けていますが、難しいと感じたら下記の記事も参考にしてみて下さい。
※過去に出題された小問題が出てくることがありますが、チケットに余裕があれば復習のつもりで取り組んでみましょう。
STEP1: インクリメント (paizaランク D 相当)
STEP1 は受け取った整数をインクリメント(+1)して出力する問題です。
解答例
<< EOS 入力例1 -10 出力例1 -9 入力例2 0 出力例2 1 入力例3 1 出力例3 2 EOS n = gets.to_i puts n + 1
解答例: 標準入力で受けとった文字列を整数型に変換、+1 して出力しています。
STEP2: 複数行の入力と出力 (paizaランク D 相当)
STEP2 はn個
の改行区切りの文字列をそのまま出力する問題です。
解答例
<< EOS 入力例1 1 54 出力例1 54 入力例2 4 382 695 928 577 出力例2 382 695 928 577 入力例3 5 856 246 368 346 336 出力例3 856 246 368 346 336 EOS # [解答例1] n = gets.to_i n.times { puts gets } # [解答例2] n = gets.to_i ary = n.times.map { gets.to_i } puts ary
解答例1: 1行目で受け取ったn回
の繰り返しを設定し、続くn行文の文字列をそのまま出力しています。
解答例2: n行
の文字列を整数型に変換したものを一旦配列ary
に格納してから、各要素を改行区切りで出力しています。
STEP3: 配列(リスト)要素の合計 (paizaランク D 相当)
STEP3 は指定された配列[1, 3, 5, 6, 3, 2, 5, 23, 2]
の合計値を出力する問題です。
解答例
ary = [1, 3, 5, 6, 3, 2, 5, 23, 2] # [解答例1] result = 0 ary.each { |num| result += num } puts result # [解答例2] puts ary.sum
解答例1: 配列ary
の要素を次々に参照して、合計値result
を求めて出力しています。
解答例2: sumメソッド
で配列ary
の合計値を求めて出力しています。
STEP4: 5以上か4以下か (paizaランク D 相当)
STEP4 は与えられた整数n
が5以上なら"high"、そうでないなら"low"と出力する問題です。
解答例
<<"EOS" 入力例1 5 出力例1 high 入力例2 6 出力例2 high 入力例3 4 出力例3 low EOS # [解答例1] n = gets.to_i if n >= 5 puts "high" else puts "low" end # [解答例2] n = gets.to_i puts n >= 5 ? "high" : "low"
解答例1: if文
で条件分岐を行い回答を出力しています。
解答例2: 三項演算子で条件分岐を行い回答を出力しています。
STEP5: 配列(リスト)データの足し合わせ (paizaランク D 相当)
STEP5 は指定された配列[4, 0, 5, -1, 3, 10, 6, -8]
のうち5以上の要素を足し合わせた値を出力する問題です。
解答例
ary = [4, 0, 5, -1, 3, 10, 6, -8] # [解答例1] result = 0 ary.each do |num| if num >= 5 result += num end end puts result # [解答例2] puts ary.select { |num| num >= 5 }.sum
解答例1: 配列ary
の要素を次々と参照し、if文
で5以上なら合計値result
に数値を足す処理を行い、繰り返しを抜けたら合計値result
を出力しています。
解答例2: select メソッド
で5以上の要素の配列を生成し、sumメソッド
で合計値を求めて出力しています。
5以上の整数の合計 (paizaランク C 相当) を解いてみる
※ paiza Bランクレベルアップメニューより
問題
改行区切りで整数がn個入力されるので、n個の整数のうち、5以上のものをすべて足し合わせた値を出力してください。
入力される値
入力は以下のフォーマットで与えられます。
n (数字の総数)
a_1
a_2
a_3
...
a_i
...
a_n
入力値最終行の末尾に改行が1つ入ります。
期待する出力
入力された整数a_iのうち5以上のものをすべて足し合わせた値を出力してください。
最後は改行し、余計な文字、空行を含んではいけません。
条件
すべてのテストケースにおいて、以下の条件をみたします。
- 1 ≦ n ≦ 1,000
- -1,000,000 ≦ a_i ≦ 1,000,000
- 入力例1
- 1
3
- 出力例1
- 0
- 入力例2
- 5
1
-5
1
4
3
- 出力例2
- 0
- 入力例3
- 9
2
-3
-3
4
-1
6
4
5
8
- 出力例3
- 19
攻略ポイント
ポイント
問題を解く流れ
入出力例をコピペしてヒアドキュメントで変数に代入し、データを確認します。正しく受け取れていれば確認用コードは削除します。
INPUT1 = <<~"EOS" 1 3 EOS OUTPUT1 = <<~"EOS" 0 EOS INPUT2 = <<~"EOS" 5 1 -5 1 4 3 EOS OUTPUT2 = <<~"EOS" 0 EOS INPUT3 = <<~"EOS" 9 2 -3 -3 4 -1 6 4 5 8 EOS OUTPUT3 = <<~"EOS" 19 EOS # 確認用コード p INPUT1 # > "1\n3\n" p OUTPUT1 # > "0\n" p INPUT2 # > "5\n1\n-5\n1\n4\n3\n" p OUTPUT2 # > "0\n" p INPUT3 # > "9\n2\n-3\n-3\n4\n-1\n6\n4\n5\n8\n" p OUTPUT3 # > "19\n"
続いて問題を解くメソッド( solve
メソッドとします)を変数の下に定義します。
まず、入力データを受け取る処理を書きます。
def solve(input_lines) # 入力データ受け取り input_lines = input_lines.split.map(&:to_i) n = input_lines.shift ary = input_lines.shift(n) # 確認用コード [n, ary] end # 確認用コード p solve(INPUT1) # > [1, [3]] p solve(INPUT2) # > [5, [1, -5, 1, 4, 3]] p solve(INPUT3) # > [9, [2, -3, -3, 4, -1, 6, 4, 5, 8]]
データが正しく受け取れていれば、solve
メソッドに配列ary
の要素の値が5以上なら足し合わせる処理を追加していきます。
def solve(input_lines) # 入力データ受け取り input_lines = input_lines.split.map(&:to_i) n = input_lines.shift ary = input_lines.shift(n) # 配列 ary の値が5以上なら result に足す result = 0 ary.each do |num| if num >= 5 result += num end end # 合計値(整数型)を返す result end # 確認用コード p solve(INPUT1) # > 0 p solve(INPUT1) == OUTPUT1 # > false p solve(INPUT2) # > 0 p solve(INPUT2) == OUTPUT2 # > false p solve(INPUT3) # > 19 p solve(INPUT3) == OUTPUT3 # > false
あとは出力形式を整えれば完成です。
p solve(INPUT1)
を puts solve(STDIN.read)
(p solve(STDIN.read)
でも可)に変更すれば正解となりますが、p solve(INPUT1) == OUTPUT1 -> true
を確認するために、結果を改行区切りの文字列に変換して、末尾にも改行を加えます。
def solve(input_lines) # 入力データ受け取り input_lines = input_lines.split.map(&:to_i) n = input_lines.shift ary = input_lines.shift(n) # 配列 ary の値が5以上なら result に足す result = 0 ary.each do |num| if num >= 5 result += num end end # 文字列型に変換して末尾に改行を追加する result.to_s << "\n" end # 確認用コード p solve(INPUT1) # > "0\n" p solve(INPUT1) == OUTPUT1 # > true p solve(INPUT2) # > "0\n" p solve(INPUT2) == OUTPUT2 # > true p solve(INPUT3) # > "19\n" p solve(INPUT3) == OUTPUT3 # > true
確認用コードを標準入力からのデータ受け取りに変更して、動作確認をしたら提出します。
複数行のデータ受け取りなので STDIN.read
を使います。(入力終了は Ctrl+D
又は Ctrl+Z
)
解答コード
def solve(input_lines) # 入力データ受け取り input_lines = input_lines.split.map(&:to_i) n = input_lines.shift ary = input_lines.shift(n) # 配列 ary の値が5以上なら result に足す result = 0 ary.each do |num| if num >= 5 result += num end end # 文字列型に変換して末尾に改行を追加する result.to_s << "\n" end puts solve(STDIN.read)
他の解答例
- 入力データが改行区切りの整数型なので多重代入で一括処理
- selectメソッドとsumメソッドで5以上の要素の合計値を求める
def solve(input_lines) n, *ary = input_lines.split.map(&:to_i) ary.select { |num| num >= 5 }.sum end puts solve(STDIN.read)
今回のまとめ
今回は基本的な繰り返し処理と条件分岐の組み合わせの問題でした。アルゴリズム的にも難しい処理はなかったのでわりと簡単に解けるのではないでしょうか。
簡単な問題は素早く解いて上位入賞を目指しましょう!