Problem:
Score : 300 points

Problem Statement

There are N stones arranged in a row. Every stone is painted white or black.
A string S represents the color of the stones. The i-th stone from the left is white if the i-th character of S is ., and the stone is black if the character is #.

Takahashi wants to change the colors of some stones to black or white so that there will be no white stone immediately to the right of a black stone.
Find the minimum number of stones that needs to be recolored.

Constraints

1 \leq N \leq 2\times 10^5

S is a string of length N consisting of . and #.

Input

Input is given from Standard Input in the following format:

N
S

Output

Print the minimum number of stones that needs to be recolored.

Sample Input 1

3
#.#

Sample Output 1

1

It is enough to change the color of the first stone to white.

Sample Input 2

5
#.##.

Sample Output 2

2

Sample Input 3

9
.........

Sample Output 3

0

Solution in C# (Mono 4.6.2.0) (judge verdict: Wrong Answer)

using System;
using System.Collections.Generic;
using System.Diagnostics;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using static System.Console;
using static System.Math;

namespace atcoder
{
    class Program
    {
        static void Main(string[] args)
        {
            do
            {
                new Program().Solve(new ConsoleInput(In));
            } while (args.Length > 0 && args[0] == "Debug");
        }

        public void Solve(ConsoleInput input)
        {
            long n = input.ReadLong;
            string s = input.Read;

            long c = 0;
            long bl = 0;
            long wh = 0;
            for (var i = 0; i < n; i++)
            {
                if (s[i] == '#')
                {
                    bl++;
                }
                else
                {
                    wh++;
                    if (i == n - 1 || s[i + 1] == '#')
                    {
                        c += Min(bl, wh);
                        bl = 0;
                        wh = 0;
                    }
                }
            }

            WriteLine($"{c}");
        }
    }
}

class Math
{
    public static int Min(params int[] a)
    {
        if (a.Length == 0) return 0;

        var min = a[0];
        for (var i = 1; i < a.Length; i++)
        {
            if (min > a[i]) min = a[i];
        }
        return min;
    }
    public static long Min(params long[] a)
    {
        if (a.Length == 0) return 0;

        var min = a[0];
        for (var i = 1; i < a.Length; i++)
        {
            if (min > a[i]) min = a[i];
        }
        return min;
    }

    public static int Max(params int[] a)
    {
        if (a.Length == 0) return 0;

        var max = a[0];
        for (var i = 1; i < a.Length; i++)
        {
            if (max < a[i]) max = a[i];
        }
        return max;
    }
    public static long Max(params long[] a)
    {
        if (a.Length == 0) return 0;

        var max = a[0];
        for (var i = 1; i < a.Length; i++)
        {
            if (max < a[i]) max = a[i];
        }
        return max;
    }

    public static int Lcm(int a, int b)
    {
        return a * b / Gcd(a, b);
    }

    public static int Gcd(int a, int b)
    {
        if (a < b)
            return Gcd(b, a);
        while (b != 0)
        {
            var remainder = a % b;
            a = b;
            b = remainder;
        }
        return a;
    }
}

class UnionFind
{
    private int[] parent;
    private int[] rank;
    private long[] size;

    public UnionFind(int count)
    {
        parent = new int[count];
        rank = new int[count];
        size = new long[count];
        for (var i = 0; i < count; i++)
        {
            parent[i] = i;
            rank[i] = 0;
            size[i] = 1;
        }
    }

    public int Root(int x)
    {
        if (parent[x] != x)
        {
            parent[x] = Root(parent[x]);
        }
        return parent[x];
    }

    public void Unite(int a, int b)
    {
        var ra = Root(a);
        var rb = Root(b);

        if (Size(ra) < Size(rb))
        {
            parent[ra] = rb;
            size[rb] += size[ra];
        }
        else
        {
            parent[rb] = ra;
            size[ra] += size[rb];
        }
        if (rank[ra] == rank[rb]) rank[ra]++;
    }

    public bool Same(int a, int b)
    {
        return Root(a) == Root(b);
    }

    public long Size(int x)
    {
        return size[Root(x)];
    }
}

class ConsoleInput
{
    private readonly System.IO.TextReader _stream;
    private readonly char _separator;
    private Queue<string> inputStream;
    public ConsoleInput(System.IO.TextReader stream, char separator = ' ')
    {
        _separator = separator;
        _stream = stream;
        inputStream = new Queue<string>();
    }
    public string Read
    {
        get
        {
            if (inputStream.Count != 0) return inputStream.Dequeue();
            string[] tmp = _stream.ReadLine().Split(_separator);
            for (int i = 0; i < tmp.Length; ++i)
                inputStream.Enqueue(tmp[i]);
            return inputStream.Dequeue();
        }
    }
    public string ReadLine { get { return _stream.ReadLine(); } }
    public int ReadInt { get { return int.Parse(Read); } }
    public long ReadLong { get { return long.Parse(Read); } }
    public double ReadDouble { get { return double.Parse(Read); } }
    public string[] ReadStrArray(long N) { var ret = new string[N]; for (long i = 0; i < N; ++i) ret[i] = Read; return ret; }
    public int[] ReadIntArray(long N) { var ret = new int[N]; for (long i = 0; i < N; ++i) ret[i] = ReadInt; return ret; }
    public long[] ReadLongArray(long N) { var ret = new long[N]; for (long i = 0; i < N; ++i) ret[i] = ReadLong; return ret; }
}