ねむーの日記~AtCoderな日々~

福岡に住むプログラミング好きのブログです!

AtCoder Beginner Contest 132 B - Ordinary Number

毎日雨でズボンが濡れてしんどいです、ねむーです。

今回はAtCoder(https://atcoder.jp/contests/abc132/tasks/abc132_b)にて開催されました、AtCoder Beginner Contest 132 B問題「B - Ordinary Number」の問題と僕との戦闘記です。

0.はじめに

今回も、プログラミング言語C#を使用しています。

1.問題文

{ 1 , 2 , . . . , n } の順列 p = { p 1 , p 2 , . . . , p n } があります。

以下の条件を満たすような p i ( 1 < i < n ) がいくつあるかを出力してください。

  • p i − 1 , p i , p i + 1 の 3 つの数の中で、 p i が 2 番目に小さい。

2.制約

  • 入力は全て整数である。
  • 3 ≤ n ≤ 20
  • p は { 1 , 2 , . . . , n } の順列である。

3.入力例

  • 入力
9
9 6 3 2 5 8 7 4 1
  • 出力
5

4.初見の感想

  • 真ん中の数字が2番目に小さいとはどういうことか?

→3つの数の中で、[最大、真ん中、最小]or[最小、真ん中、最大]というパターンの2通り。

  • 「最大>真ん中&&真ん中>最小」という条件式で判定できる

5.コードと簡単な解説

using System;
using System.Collections.Generic;
using System.Linq;

class Program
{
    static void Main(string[] args)
    {
        //入力
        int N = int.Parse(Console.ReadLine());
        string[] input = Console.ReadLine().Split();
        int[] list = new int[N];
        for(int i = 0; i < N; i++)
        {
            list[i] = int.Parse(input[i]);
        }
  //条件判定
        int ans = 0;
        for(int i = 0; i < N-2; i++)
        {
            if (list[i] > list[i + 1] && list[i + 1] > list[i + 2]) { ans++; }
            else if(list[i] < list[i + 1] && list[i + 1] < list[i + 2]) { ans++; }
        }
        Console.WriteLine(ans);
    }
}

6.最後に

簡単な問題なので、コードを簡潔に書けるよう工夫したいところです。