[paiza レベルアップ問題集] 日付セット　連休を伸ばす2 (paizaランク A 相当)

[paizaのレベルアップ問題集](https://paiza.jp/works/mondai/dateset/extend_holidays_2?language_uid=c-sharp&t=85ea72bebedc250c1002c0d465687ffc)に挑戦。

####考え方
連休の初日を１日ずつずらしていく。
前のループにおける①連休の初日が休日か営業日か、②連休の最終日がいつか、③何連休であったかを利用する。

```c#

    class Program
    {
        static int howManyHolidays(int firstDay,int N, int L, int[] list)
        {
            int counter = 0;
            for(int i = firstDay; i < N; i++)
            {
                if(list[i] == 1)
                {
                    counter++;
                }
                else if(L > 0)
                {
                    counter++;
                    L--;
                }
                else
                {
                    break;
                }
            }
            return counter;
        }
        static void Main(string[] args)
        {
            string[] input = Console.ReadLine().Trim().Split(' ');
            int N = int.Parse(input[0]), L = int.Parse(input[1]);
            input = Console.ReadLine().Trim().Split(' ');
            int[] list = new int[N]; //1 -> 休業日、0 -> 営業日
            for(int i = 0; i < N; i++)
            {
                list[i] = int.Parse(input[i]);
            }
            //連休の初日が１日目の場合求める
            int firstDay = 0;
            int temp = howManyHolidays(firstDay, N, L, list);
            int max = temp;
            int lastDay = firstDay + temp - 1; //連休の初日がfirstDayの場合の連休の最終日
            //連休の初日を一日ずつずらす
            for(int i = 1; i < N; i++)
            {
                temp--;
                //連休の初日の前日営業日の場合、(lastDay+1)日目から後１回年休が使える
                int paidDay; 
                if(list[i - 1] == 0)
                {
                    paidDay = 1;
                }
                else
                {
                    paidDay = 0;
                }
                for(int j = lastDay + 1; j < N; j++)
                {
                    if(list[j] == 1)
                    {
                        temp++;
                    }else if(paidDay == 1)
                    {
                        temp++;
                        paidDay--;
                    }
                    else
                    {
                        lastDay = j - 1;
                        break;
                    }
                }
            if(temp > max)
                {
                    max = temp;
                }
            }
            Console.WriteLine(max);
        }
    }
````
[youtubeの解説動画](https://www.youtube.com/watch?v=yudu6zB7XKI)を視聴後に書いたコード

```c#

    class Program
    {
        static int howManyHolidays(int firstDay,int N,int L,int[] list)
        {
            //L日は休める -> 0の日を１に書き換えられる　×　L回
            int one = 0; //休業日を数える変数
            int zero = 0; //年休を使った日数を数える変数
            while(firstDay + one + zero < N)
            {
                if(list[firstDay] == 1)
                {
                    one++;
                }
                else
                {
                    if(zero == L)
                    {
                        break;
                    }
                    zero++;
                }
            }
            return one + zero;
        }
        static void Main(string[] args)
        {
            string[] input = Console.ReadLine().Trim().Split(' ');
            int N = int.Parse(input[0]), L = int.Parse(input[1]);
            input = Console.ReadLine().Trim().Split(' ');
            int[] list = new int[N]; //1 -> 休業日、0 -> 営業日
            for (int i = 0; i < N; i++)
            {
                list[i] = int.Parse(input[i]);
            }
            int result = 0;
            int one = 0;
            int zero = 0;
            for (int left = 0, right = 0; right < N; right++)
            {
                if(list[right] == 1)
                {
                    one++;
                }
                else
                {
                    zero++;
                    while(zero > L)
                    {
                        //leftを増やす、oneとzeroを調整
                        if(list[left] == 1)
                        {
                            one--;
                        }
                        else
                        {
                            zero--;
                        }
                        left++;
                    }
                }
                if(one + zero > result)
                {
                    result = one + zero;
                }
            }
            Console.WriteLine(result);
        }
    }
````