Header
2020-04-05
2020-06-04

paiza(パイザ)Bランク練習問題|日別訪問者数の最大平均区間のRubyサンプルコードと解説

2020 04 05 129901095e2a951cf9d44a75fd1d597e s

paiza(パイザ)Bランク相当の練習問題 日別訪問者数の最大平均区間の解説とサンプルコード、Rubyサンプルコードの解説を記載します。

問題の要件と概要は以下から

日別訪問者数の最大平均区間

以下から公式の抜粋を元にプログラム化する際の思考の流れとサンプルコードを記載します

関連問題

paiza(パイザ)Bランク練習問題|神経衰弱のRubyサンプルコードと解説

paiza(パイザ)Cランク練習問題|5以上の整数の合計のRubyサンプルコードと解説

paiza(パイザ)Cランク練習問題|検索履歴のRubyサンプルコードと解説

paiza(パイザ)Cランク練習問題|宝くじのRubyサンプルコードと解説

paiza(パイザ)Cランク練習問題|アルファベット探しのRubyサンプルコードと解説

paiza(パイザ)Cランク練習問題|単語のカウントのRubyサンプルコードと解説

paiza(パイザ)Cランク練習問題|野球の審判のRubyサンプルコードと解説

paiza(パイザ)Cランク練習問題|【競技7】奇数大好き山田さんのRubyサンプルコードと解説

目次


Bランク問題の日別訪問者数の最大平均区間のカウントの入出力値

以下公式抜粋

あなたは、とあるウェブサイトを管理していました。
ある連続したk日間、このウェブサイトでキャンペーンを行ったのですが、いつからいつまでの期間に行ったかを忘れてしまいました。

幸い、ウェブサイトを運営していた全n日分のアクセスログが残っており、1日ごとの訪問者数が分かっています。
とりあえず、連続するk日の中で、1日あたりの平均訪問者数が最も多い期間を、キャンペーンを行った期間の候補だと考えることにしました。

n日分の訪問者数のリストとキャンペーンの日数kが入力されるので、キャンペーンを行った期間の候補数と、候補の中で最も早い開始日を出力してください。

入力値

入力は2行から成ります。

1行目にはnとkが半角スペース区切りで入力されます。

2行目にはn個の整数a_1, a_2, …, a_nが半角スペース区切りで入力されます。a_iはi日目の訪問者数を表します。


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

期待する出力

キャンペーンを行った期間の候補数と、候補の中で最も早い開始日を、この順で半角スペース区切りで1行で出力してください。

入出力例(公式から抜粋)

入力例1
5 3
1 2 3 2 1

出力例1
1 2

入力例2
10 2
6 2 0 7 1 3 5 3 2 6

出力例2
5 1

問題をプログラム化する際の考え方

入力値で以下のように記載されています。

入力例1
5 3
1 2 3 2 1

ここで分かる事は

1:数字を指定している

2:1行目には 2個の値を取得したい事が分かります(n日分の訪問者のリスト、キャンペーン期間 k日間)

3:2行目は n(5)日間と指定された値が 1行で入力される事が分かります

次に出力例を見ると 期待する出力に

キャンペーンを行った期間の候補数と、候補の中で最も早い開始日と記載されているので、この2点を出力する事が分かります

出力例1
1 2

1日あたりの平均訪問者数が最も多い期間 を キャンペーンを行った期間の候補 とするという記述があるので 平均訪問者数を求める必要があります。

1:「連続するk日間の中で、1日あたりの平均訪問者数が最も多い期間を調べる必要がある →平均訪問者数を求めるためには、[1,2,3,][2,3,2][3,2,1]をそれぞれ足し、合計をキャンペーン期間 3 で割ると平均値を求められます

2:入力例の(2行目)の左から順に1日目となり、候補の[2,3,2]の2の二日目が候補の中で最も早い開始日であるという事が分かります

プログラム化する際にRuby的な処理を考える

1:全日数とキャンペーン期間を取得

2:全日数の訪問者数を取得

3:キャンペーンを行った期間の候補をいれるための空配列の作成

4:全日分の訪問者数をキャンペーン期間分ループさせ、取得した値を 3. 空配列にいれる

5:平均値を取得する為の空配列の作成

繰り返し処理を用いて、平均値を求める

6:最大値を保存する為の変数の生成

繰り返し処理を用いて、最大値を求める

7:開始日を保存する為の変数の生成

繰り返し処理を用いて、開始日を求める

8:候補数を保存する為の変数の生成

繰り返し処理を用いて、候補数を求める

9:最後にキャンペーンを行った期間の候補数と、候補の中で最も早い開始日を出力する

paizaBランク問|日別訪問者数の最大平均区間のRubyサンプルコード

# 全日分とキャンペーン期間の取得
all_days_part, campaign_period = gets.chomp.split(" ").map(&:to_f)

# 二行目の全日分の訪問者数を取得する
visitor_numbers = gets.chomp.split(" ").map(&:to_i)

#キャンペーンを行った期間の候補をいれるための空配列の作成
campaign_candidates = []

# 全日分の訪問者数をキャンペーン期間でループさせ、取得した値を空配列にいれる
visitor_numbers.each_cons(campaign_period).map{|candidate|campaign_candidates << candidate.sum}

#  キャンペーンの各区間の平均値
averages = []

campaign_candidates.each do |average| 
  averages << (average / campaign_period) 
end 

# キャンペーンの期間での最大値を求める
ans_max = 0 
averages.each do |i|
  if ans_max < i
    ans_max = i
  end
end 

# キャンペーン期間候補の最初に出てくる日を探す
ans_first_max = 0
averages.each do |i|
  if i == ans_max
    break
  else 
    ans_first_max += 1
  end   
end

# 最大値と同じ値の個数を求める
ans_count = 0
averages.each do |i|
  if ans_max == i 
    ans_count += 1
  end 
end 

#キャンペーンを行った期間の候補数と、候補の中で最も早い開始日

puts "#{ans_count} #{ans_first_max + 1}" 

1行目は浮動小数点数で値を取得したかったのでto_fにしています。

all_days_part, campaign_period = gets.chomp.split(" ").map(&:to_f)

2行目は割る値の為浮動小数点は気にしないで良いので to_i で取得しています。

visitor_numbers = gets.chomp.split(" ").map(&:to_i)

eachcons(n) メソッドは 要素を重複ありで n 要素ずつに区切り、ブロックに渡して繰り返す事をしてくれる為、eachconsメソッドを用い、sumメソッドで各期間の合計値を配列に入れています。

visitor_numbers.each_cons(campaign_period).map{|candidate|campaign_candidates << candidate.sum}

その後、合計値をキャンペーン期間で割ることで平均値を求めました。

以上になります

Rubyで以下のような練習問題を用意しているので、回答できなかった方はまずは以下練習問題を試してみてください

Rubyの練習問題:配列編|初心者・独学者向け入門コンテンツ

Rubyの練習問題:文字列編|初心者・独学者向け入門コンテンツ

Rubyの練習問題:ハッシュ編|初心者・独学者向け入門コンテンツ

Rubyの練習問題:繰り返し処理編|初心者・独学者向け入門コンテンツ

Rubyの練習問題:ファイル操作編|初心者・独学者向け入門コンテンツ

Rubyでバブルソートを行う

Rubyで二分探索(バイナリサーチ)を行う

paiza(パイザ)に慣れるとAtCoderアットコーダーもお勧めです

その他関連記事

新卒から6年間業務SESで勤務された方のSESの実態をインタビュー

客先常駐SESからWeb系自社サービスのエンジニアに転職した実例

27歳から未経験で自社サービス会社のエンジニアに転職された方の勉強法や通学したプログラミングスクール

27歳から未経験で自社サービス会社のエンジニアに転職された方の転職媒体やエンジニア情報の収集先など

未経験からエンジニアに転職した人間が考える、今からエンジニアに就職する方法

低単価で海外ノマドのフリーランスや旅するように仕事するのは危険

SESからフリーランスになる際のメリットとデメリット|法人化した人間が解説

職歴を作るためにSESに就職して、Web系エンジニアへ転職は可能か

プログラミングで挫折する人の特徴|未経験からエンジニアに転職した人間が解説

独学プログラミングの勉強手順|未経験からエンジニアに転職した人間が解説

あなたにお勧めの記事
前の記事
次の記事