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: Accepted)

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

namespace Program
{
    interface Output
    {
        void Write(object str);
        void WriteLine(object str);
    }

    interface Input
    {
        int NextInt();
        string NextString();
    }

    class Console_ : Input, Output
    {
        Queue<string> param = new Queue<string>();
        int Input.NextInt()
        {
            if (param.Count == 0)
            {
                foreach (var item in Console.ReadLine().Split(' '))
                {
                    param.Enqueue(item);
                }
            }
            return int.Parse(param.Dequeue());
        }
        string Input.NextString()
        {
            if (param.Count == 0)
            {
                foreach (var item in Console.ReadLine().Split(' '))
                {
                    param.Enqueue(item);
                }
            }
            return param.Dequeue();
        }
        void Output.Write(object str)
        {
            System.Console.Write(str.ToString());
        }
        void Output.WriteLine(object str)
        {
            System.Console.WriteLine(str.ToString());
        }
    }

    class Program
    {
        static void Main(string[] args)
        {
            new Solver(new Console_(), new Console_()).Run();
        }
    }

    class Debug_ : Input
    {
        int i = 0;
        int Input.NextInt()
        {
            return (int)data[i++];
        }
        string Input.NextString()
        {
            return (string)data[i++];
        }
        object[] data =
        {
            15,
            "#.#..##.#..#.###"
        };
    }

    class Solver
    {
        Input input;
        Output output;
        public Solver(Input input, Output output)
        {
            this.input = input;
            this.output = output;
        }

        public void Run()
        {
            var N = input.NextInt();
            var S = input.NextString().Select(e => e == '.' ? false : true).ToArray();
            var aryBlack = new int[S.Length];
            var aryWhite = new int[S.Length];

            bool not = false;
            bool not2 = true;
            bool not3 = false;
            bool not4 = true;
            for (int i = 0; i < S.Length; ++i)
            {
                if (not2 & S[i])
                {
                    not3 = true;
                }
                if (not3 & !S[i])
                {
                    not4 = false;
                }
                var whiteIdx = S.Length - i - 1;
                if (i == 0)
                {
                    aryBlack[i] = S[i] ? 1 : 0;
                    aryWhite[whiteIdx] = S[whiteIdx] ? 0 : 1;
                }
                else
                {
                    not = not | (S[i] ^ S[i - 1]);
                    aryBlack[i] = aryBlack[i - 1] + (S[i] ? 1 : 0);
                    aryWhite[whiteIdx] = aryWhite[whiteIdx + 1] + (S[whiteIdx] ? 0 : 1);
                }
            }
            if (!not || not4)
            {
                output.WriteLine(0);
                return;
            }
            int sum = 0xfffffff;
            for (int i = 0; i <= S.Length; ++i)
            {
                var tmp = 0;
                if (i == 0)
                {
                    tmp = aryWhite[i];
                }
                else if (i == S.Length)
                {
                    tmp = aryBlack[i - 1];
                }
                else
                {
                    tmp = aryBlack[i - 1] + aryWhite[i];
                }
                sum = Math.Min(tmp, sum);
            }

            output.WriteLine(sum);
        }

    }
}