Problem:
輪ゴム

n 本の釘を平板上の座標 P1 (x1, y1), P2 (x2, y2), P3 (x3, y3),..., Pn (xn, yn) に１本ずつ打ち、輪ゴムの輪の中に全ての釘が入るように 1 本の輪ゴムで囲みます。このとき、輪ゴムが交差してはいけません。

釘の座標を読み込んで、上記のように釘を輪ゴムで囲んだときに輪ゴムに接していない釘の本数を出力するプログラムを作成してください。輪ゴムは充分に伸び縮みするものとします。同じ座標に 2 本以上の釘を打つことはないものとします。また、輪ゴムがかかった釘と釘の間は直線で結ばれるものとし、その直線上に 3 本以上の釘が並ぶことはないものとします。例えば、図 1 に示すような入力はありえません。図 2 に示すように輪ゴムがかかっていない釘が 1 直線上に並ぶことはありえます。

図１

図２

ただし、それぞれの座標値は -1000.0 以上1000.0 以下の実数です。また、n は 3 以上 100 以下の整数です。

Input

複数のデータセットが与えられます。各データセットは以下のような形式です与えられます。

n
x1, y1
x2, y2
... 　　　　
...
xn, yn

n が 0 の時、入力の最後を示します。データセットの数は 50 を超えません。

Output

データセットごとに、ゴムと接していない釘の本数を出力してください。

例えば、図 3 に示す４つの釘を表す入力があった場合、図 4 のように囲まれるので、輪ゴムに接していない釘の本数は 1 本です。

図３

図４

Sample Input

4
1.0,0.0
0.0,1.0
2.0,1.0
1.0,2.0
9
-509.94,892.63
567.62,639.99
-859.32,-64.84
-445.99,383.69
667.54,430.49
551.12,828.21
-940.2,-877.2
-361.62,-970
-125.42,-178.48
0

Output for the Sample Input

0
3

Hint

以下は２つめのサンプル入力に対する図です。

Solution in JAVA (judge verdict: Accepted)

import java.util.Arrays;
import java.util.Scanner;

public class Main {
	Scanner sc = new Scanner(System.in);
	
	void io(){
		
		while(true){
			int n = ni();
			if(n==0)
				break;
			
			// 一番左の点から
			int left=0;
			double[][] map = new double[n][2];
			for(int i=0; i<n; ++i){
				map[i] = ndl();
				if(map[i][0] < map[left][0]){
					left = i;
				}
			}
			final int last = left;
			int now = left;
			int count = n;
			// 一番左なので、真上を指すベクトルから
			double[] v = new double[]{0., 1.};
			do{
				--count;
				double min = 360.1;
				int i_best = 0;
				double[] v_best = v;
				for(int i=0; i<n; ++i){
					// 自身以外の全探索
					if(i!=now){
						// 進行方向ベクトル, vに対する角度を求める
						
						// 内積から0~180度の角度を得る
						double[] v_ = new double[]{map[i][0]-map[now][0], map[i][1]-map[now][1]};
						double ab = v[0]*v_[0] + v[1]*v_[1];
						double a_ = Math.sqrt(v[0]*v[0] + v[1]*v[1]);
						double b_ = Math.sqrt(v_[0]*v_[0] + v_[1]*v_[1]);
						double cos_ = ab/(a_*b_);
						double ang_ = Math.toDegrees(Math.acos(cos_));
						
						// 外積で左向いていたら180度げたはかせる
						double axb = v[0]*v_[1] - v[1]*v_[0];
						if(axb > 0){
							ang_ = 360. - ang_;  //(180. - ang_) + 180.
						}
						
						//debug(map[now], map[i], ang_);
						// 方向ベクトルに対する一番時計回りに近い点を得る
						if(ang_ < min){
							min = ang_;
							i_best = i;
							v_best = v_;
						}
					}
				}
				
				// 点の移動
				now = i_best;
				v = v_best;
			}while(now!=last);
			
			// 残りのn(count)が中に入っている点の数
			System.out.println(count);
		}
	}
	
	double[] ndl(){
		String[] str = sc.next().split(",");
		double args[] = new double[2];
		for(int i=0; i<2; ++i){
			args[i] = Double.parseDouble(str[i]);
		}
		return args;
	}
	
	int ni(){
		return sc.nextInt();
	}
	
	public static void main(String[] args) {
		new Main().io();
	}

	void debug(Object... os){
		System.err.println(Arrays.deepToString(os));
	}
}