友達の数

　今回の問題は、友達の数が一番多い人の、その友達の数を出力するコード作成です。少し複雑になってきた気がします。友達の友達まで考慮する必要があるので、関係性が難解になって、自分も落とし穴にはまった気がします（T_T）
　外出先から投稿するので、コードの正当性が確認出来ませんが、あってないかな・・・正直自信無いです。不可解な点や、間違いなどがございましたら、ご指摘頂けると幸いです。また、mainメソッドの配列friend,friend2, friend3はテストケースになります。
問題元SRM436 Div2 Level1
問題文：
　あなたはソーシャルネットサークで最も人気のある人を決めようと思っています。このため、に各人が持つ「友達の数」を数えます。彼らがお互いに友人なら、あるいはCさんがAさんとBさん共通の友人なら、AさんはBさんと「友達」です。最も人気のある人は「友達」の数が最も多い人です（最も多くの「友達の数」を持つ人は複数いるかもしれません）。
　文字列型配列friends[]が渡されます。もしi番目さんとj番目さんが友人ならi要素のj番目文字が'Y'で、そうでなければ'N'です。このソーシャルネットワークで最も人気のある人の「友達の数」を返して下さい。

```java:
package friendRelation;
import java.util.*;
public class friend {
	public static int highestScore(String[] friends) {
		int[] numHuman = new int[friends.length]; //各人の友達人数
		char[][] human = new char[friends.length][];//Y,Nの二次元配列
		HashMap<Integer, Integer> hm = new HashMap<Integer, Integer>();//友達関係を記録
		ArrayList<Integer> list = new ArrayList<Integer>(); //HashMapでnull値が検出された場合の対処法(キー保存用可変長配列)
		//char型の配列化
		for(int r = 0; r < friends.length; r++) { 
			human[r] = friends[r].toCharArray();
		}
		//最初の処理
		for(int r = 0; r < human.length; r++) {
			for(int c = 0; c < human[r].length; c++) {
				if(human[r][c] == 'N') continue;
				numHuman[r]++;
				numHuman[c]++;
				hm.put(r, c);
				list.add(r);
				human[r][c] = 'N';
				human[c][r] = 'N';
			}
		}
		//友達の友達の処理
		int[] buffer = new int[list.size()];
		for(int r = 0; r < list.size(); r++) {
			int get = list.get(r);
			int c = hm.get(get);
			buffer[r] = numHuman[r] - 1;  
			numHuman[r] += numHuman[c] - 1;
			//System.out.println("Key:" + r + "Value:" + c); //DEBUG
		}
		//System.out.print("buffer(補正):");//DEBUG
		for(int r = 0; r < buffer.length; r++) {
			//System.out.print(buffer[r] + " "); DEBUG
			numHuman[r + 1] += buffer[r];
		}
		//System.out.println(); DEBUG
		//出力(実際に答えを出すときは、最大値走査)
		int max = Integer.MIN_VALUE;
		for(int r = 0; r < numHuman.length; r++) {
			if(numHuman[r] > max) max = numHuman[r];
		}
		return(max);
	}
	
	public static void main(String[] args) {
		// TODO Auto-generated method stub
		String[] friends = new String[]{   //0 - 1 - 2 - 3 - 4
				"NYNNN",
				"YNYNN",
				"NYNYN",
				"NNYNY",
				"NNNYN",
		};
		String[] friends2 = new String[]{
				"NNNNYNNNNN",
				"NNNNYNYYNN",
				"NNNYYYNNNN",
				"NNYNNNNNNN",
				"YYYNNNNNNY",
				"NNYNNNNNYN",
				"NYNNNNNYNN",
				"NYNNNNYNNN",
				"NNNNNYNNNN",
				"NNNNYNNNNN",
		};
		String[] friends3 = new String[]{
				"NNNNNNNNNNNNNNY",
				"NNNNNNNNNNNNNNN",
				"NNNNNNNYNNNNNNN",
				"NNNNNNNYNNNNNNY",
				"NNNNNNNNNNNNNNY",
				"NNNNNNNNYNNNNNN",
				"NNNNNNNNNNNNNNN",
				"NNYYNNNNNNNNNNN",
				"NNNNNYNNNNNYNNN",
				"NNNNNNNNNNNNNNY",
				"NNNNNNNNNNNNNNN",
				"NNNNNNNNYNNNNNN",
				"NNNNNNNNYNNNNNN",
				"NNNNNNNNNNNNNNN",
				"NNNNNNNNNNNNNNN",
				
		};
		System.out.println(highestScore(friends));
	}
}
```

修正してみました。
やはりエラーが起きました。恐らく、配列bufferに格納している値を足している箇所がおかしいのだと思います。単純な友達の数え方はあっているが、友達の友達を数えられていない様です。


```java:
package friendRelation;
import java.util.*;
public class friend {
	
	public static int highestScore(String[] friends) {
		int[] numHuman = new int[friends.length]; //各人の友達人数
		char[][] human = new char[friends.length][];//Y,Nの二次元配列
		HashMap<Integer, Integer> hm = new HashMap<Integer, Integer>();//友達関係を記録
		ArrayList<Integer> list = new ArrayList<Integer>(); //HashMapでnull値が検出された場合の対処法(キー保存用可変長配列)
		//char型の配列化
		for(int r = 0; r < friends.length; r++) { 
			human[r] = friends[r].toCharArray();
		}
		//最初の処理
		for(int r = 0; r < human.length; r++) {
			for(int c = 0; c < human[r].length; c++) {
				if(human[r][c] == 'N') continue;
				numHuman[r]++;
				numHuman[c]++;
				hm.put(r, c);
				list.add(r);
				human[r][c] = 'N';
				human[c][r] = 'N';
			}
		}
		//友達の友達の処理
		int[] buffer = new int[list.size()];
		for(int r = 0; r < list.size(); r++) {
			int get = list.get(r);
			int c = hm.get(get);
			buffer[r] = numHuman[r] - 1;  
			numHuman[r] += numHuman[c] - 1;
			//System.out.println("Key:" + r + "Value:" + c); //DEBUG
		}
		System.out.print("buffer:");
		
		for(int r = 0; r < buffer.length; r++) {
			System.out.print("r:" + r + buffer[r] + " "); 
			numHuman[r + 1] += buffer[r]; //①
		}
		/////
		//buffer.length,numHuman[r + 1] += buffer[r]
		/////
		//・numHuman[numHuman.length - 1] += buffer[3];
		//		テストケース１を除いて誤差、maxの誤差がみられる
		//		テストケース２は例外スローが起きるArrayIndexOutOfBoundsException:10@①
		//System.out.println(); DEBUG
		//出力(実際に答えを出すときは、最大値走査)
		int max = Integer.MIN_VALUE;
		for(int r = 0; r < numHuman.length; r++) {
			if(numHuman[r] > max) max = numHuman[r];
			System.out.print(numHuman[r]);
		}
		System.out.println();
		//System.out.println(buffer[buffer.length - 1]);
		//System.out.println(buffer.length);
		return(max);
	}
	
	
	
	
	public static void main(String[] args) {
		// TODO Auto-generated method stub
		String[] friends = new String[]{   //0 - 1 - 2 - 3 - 4
				"NYNNN",
				"YNYNN",
				"NYNYN",
				"NNYNY",
				"NNNYN",
		};
		String[] friends2 = new String[]{
				"NNNNYNNNNN",
				"NNNNYNYYNN",
				"NNNYYYNNNN",
				"NNYNNNNNNN",
				"YYYNNNNNNY",
				"NNYNNNNNYN",
				"NYNNNNNYNN",
				"NYNNNNYNNN",
				"NNNNNYNNNN",
				"NNNNYNNNNN",
		};
		String[] friends3 = new String[]{
				"NNNNNNNNNNNNNNY",
				"NNNNNNNNNNNNNNN",
				"NNNNNNNYNNNNNNN",
				"NNNNNNNYNNNNNNY",
				"NNNNNNNNNNNNNNY",
				"NNNNNNNNYNNNNNN",
				"NNNNNNNNNNNNNNN",
				"NNYYNNNNNNNNNNN",
				"NNNNNYNNNNNYNNN",
				"NNNNNNNNNNNNNNY",
				"NNNNNNNNNNNNNNN",
				"NNNNNNNNYNNNNNN",
				"NNNNNNNNNNNNNNN",
				"NNNNNNNNNNNNNNN",
				"YNNYYNNNNYNNNNN",
		};
		
		String[] friends4 = {
				"NNN",
				"NNN",
				"NNN",
		};
		System.out.println(highestScore(friends2));
	}
}


```