unittest
{
	assert( [ "3", "#.#" ].parse.expand.solve == 1 );
	assert( [ "5", "#.##." ].parse.expand.solve == 2 );
	assert( [ "9", "........." ].parse.expand.solve == 0 );
}



import std.algorithm;
import std.conv;
import std.range;
import std.stdio;
import std.typecons;

void main()
{
	stdin.byLineCopy.parse.expand.solve.writeln;
}

auto parse( Range )( Range input )
if( isInputRange!Range && is( ElementType!Range == string ) )
{
	auto n = input.front.to!( long );
	input.popFront;
	auto s = input.front;
	return tuple( s );
}

auto solve( string s )
{
	auto gs = s.group.array;
	if( gs.length == 1 ) return 0L;
	
	// 入力を整形
	if( gs[ 0     ][ 0 ] == '.' ) gs  = gs[ 1 .. $ ];
	if( gs[ $ - 1 ][ 0 ] == '.' ) gs ~= [ Tuple!( dchar, uint )( '#', 0 ), Tuple!( dchar, uint )( '.', 0 ) ];
	else                          gs ~= [ Tuple!( dchar, uint )( '.', 0 ), Tuple!( dchar, uint )( '#', 0 ), Tuple!( dchar, uint )( '.', 0 ) ];
	
	// i番目の黒を境界にした場合を計算（i-1番目までの黒を白にして、i+1番目以降の白を黒にする）
	auto wt = reduce!( ( a, b ) => b[ 0 ] == '.' ? a + b[ 1 ] : a )( 0L, gs );
	auto ans = long.max;
	auto b = 0L;
	auto w = 0L;
	for( auto i = 0L; i < gs.length; i += 2 )
	{
		ans = min( ans, b + ( wt - w ) );
		
		b += gs[ i ][ 1 ];
		w += gs[ i + 1 ][ 1 ];
	}
	
	return ans;
}
