このページについて

このページは、paiza ラーニング内に開設されているコンテンツ「レベルアップ問題集」で取り扱われているプログラミング課題について、独自の見解を述べたものです。

見解については、paizaラーニングの規約に基づき、許可されている範囲でのみ公開していますが、その内容については paiza とは一切関係なく、また paiza の立場を反映したものではありませんのでご注意ください。

挑戦する課題

レベルアップ問題集日付セットから「連休を伸ばす1 (paizaランク B 相当)」を取り上げます。

以下は、問題公開 Web ページからの引用です。

問題

ある連続する N日が休業日か営業日かのリストが与えられます。
L日までの有休を使って作ることができる最長の連休の日数を求めてください。

ただし、

  • 連休とは連続する休業日の数です。
  • 有休を1日使うとある営業日を休業日にすることができます。

入力される値

以下の形式で、整数 NLが1行目で与えられ、2行目で N日の各日が休業日か営業日かのリストが与えらます。

  • 入力例

  • 出力例

期待する出力

以下のような形式で、答えを出力してください。

考え方

基本的な考え方は、与えられた有給休暇分、出勤日を休暇にし、その中から再長となる休暇数を調べることです。
効率的な方法は色々あるかと思いますが、ここでは力技で解いてゆくことにします。

たとえば、休暇日を 1 とし、出勤日を  0  、与えられる有給休暇数を 1としたとき、出勤予定表が次のようだったとします。

このとき、一番最初に現れる出勤日から順番に有給休暇を埋めていきます。

すると、パターンとしては

の3つのパターンが考えられます。

今度はこの3つのパターンを連続した 1で構成される2次元配列に変形します。
つまり、

という感じに変形します。

その後、配列内の各配列に対し、含まれる 1の数を求め、その最大値を計算します。すると、

という具合に求まり、最終的に連続して取得できる有給休暇数は「4日」という結果を得ることが可能となります。

ここで気をつけなければならないのは、入力パターンとして、「最初から全ての日付が休暇だった」というパターンもあり得るということです。

それを確認するため、 firstindex(of:) の戻り値をオプショナルバインディングで確認し、出勤日が見つからなかった場合には、入力された出勤簿の数をそのまま休暇数として求める作業をおこなっています。
つまり、 sa を出勤簿の配列とした場合、

という具合で処理をおこなっています。

解答例