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: Wrong Answer)

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.PriorityQueue;
import java.util.Stack;

public class Main{
	public static void main(String[] args)throws IOException{
		InputStreamReader isr = new InputStreamReader(System.in);
		BufferedReader reader = new BufferedReader(isr);
		String string;
		
		int n, index, count;
		double point[][];
		while(!(string = reader.readLine()).equals("0")){
			n = Integer.valueOf(string);
			if(n == 3){ continue; }
			
			point = new double[n][2];
			
			string = reader.readLine();
			index = 0;
			point[0][0] = Double.valueOf(string.split(",")[0]);
			point[0][1] = Double.valueOf(string.split(",")[1]);
			for(int i = 1; i < n; i++){
				string = reader.readLine();
				point[i][0] = Double.valueOf(string.split(",")[0]);
				point[i][1] = Double.valueOf(string.split(",")[1]);
				
				if(point[i][0] < point[index][0]){
					index = i;
				}else if(point[i][0] == point[index][0] &&
						 point[i][1] < point[index][1]){
					index = i;
				}
			}
			
			PriorityQueue<Party> que = new PriorityQueue<Party>();
			for(int i = 0; i < n; i++){
				if(i != index){
					double radians = Math.atan2((point[i][1] - point[index][1]),
												 point[i][0] - point[index][0]);
				
					Party party = new Party(radians, point[i]);
					que.add(party);
				}
			}
			
			Stack<Pair> stack = new Stack<Pair>();
			stack.push(new Pair(que.peek().x, que.poll().y));
			stack.push(new Pair(que.peek().x, que.poll().y));
			stack.push(new Pair(que.peek().x, que.poll().y));
			count = 0;
			while(!que.isEmpty()){
				Pair p1 = stack.pop();
				Pair p2 = stack.pop();
				Pair p3 = stack.pop();
				
				Pair vec1 = new Pair(p2.x - p1.x, p2.y - p1.y);
				Pair vec2 = new Pair(p3.x - p1.x, p3.y - p1.y);
				
				if(0 >= vec1.x * vec2.y - vec1.y * vec2.x){
					count++;
				}
				
				stack.push(p1);
				stack.push(p2);
				stack.push(p3);
				stack.push(new Pair(que.peek().x, que.poll().y));
			}
			System.out.println(count);
		}
		reader.close();
	}
}

class Party implements Comparable<Party>{
	double radians;
	double x;
	double y;
	
	Party(double radians, double point[]){
		this.radians = radians;
		this.x = point[0];
		this.y = point[1];
	}

	@Override
	public int compareTo(Party o){
		return radians - o.radians < 0 ? -1 : 1;
	}
}

class Pair{
	double x;
	double y;
	
	Pair(double x, double y){
		this.x = x;
		this.y = y;
	}
}