エンコードテストの問題を解決しました.


学院で知り合った人がコードテストを見て持ってきた問題なので解けました.


package code.room;

import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

public class WarGame {
	
	char [][] map;

	public static void main(String[] args) {
		String[] maps = {"AABCA.QA","AABC..QX","BBBC.Y..",".A...T.A","....EE..",".M.XXEXQ","KL.TBBBQ"};
		
		//{"XY..","YX..","..YX",".AXY"};
		//{"AABCA.QA","AABC..QX","BBBC.Y..",".A...T.A","....EE..",".M.XXEXQ","KL.TBBBQ"};
		WarGame wg = new WarGame();
		
		int result = wg.solution(maps);

	}
	
	/* <지도 그룹 나누기>
	 * 1. 점이 아닌 칸을 하나 찾는다.
	 * 2. 해당칸의 좌표를 ArrayList에 넣는다.
	 * 3. 모든칸을 순회하면서 점이아니면 상하좌우를 살펴서  상하좌우 좌표가 ArrayList에 있는지 확인한다. 있으면 해당좌표를 ArrayList에 넣는다. 그후 그 위치를 점으로 바꾼다.
	 * 4. 한바퀴를 다 돌면 더 해당하는게 없는지 한번더 확인한다. 더이상 넣을 좌표가 없으면 해당 ArrayList을 map에 group1 key로 저장한다.
	 * 
	 * 위 1~4를 반복해  모든 칸이 점이 될때까지 반복한다.
	 * 
	 * <전쟁하기>
	 * 1.해당 그룹의 제일 많은 알파벳을 뽑는다.A~Z까지 개수를 뽑아서 제일 많은 개수를 확인한다.
	 * 2.해당 개수와 같은 알파벳이 있는지 확인한다.
	 * 3.없으면 모두 해당 알파벳으로 바꾼다.
	 * 4.있으면 누가 더 나중의 알파벳인지 확인한 후 큰것을 winner에 담는다. 같은 수의 알파벳을 twin에 담아둔다. 그 후 변수에 담아놓은 알파벳을 제외한 알파벳을 winner로 바꾼다.
	 * 
	 * 5. 3또는 4를 실행 후 warMap에 전쟁결과를 담아둔다.
	 * 
	 * Map에 있는 ArrayList를 하나씩 꺼내 모두 같은 작업을 한다.
	 * 
	 * <총합계내기>
	 * warMap에서 가장 수가 많은 알파벳을 찾고 그 수를 리턴한다.
	 * */
	
	public int solution(String[] maps) {
		Map<String, Object> war = new HashMap<String, Object>(); //워 그룹
		int groupIndex = 1; //맵에 들어갈 key값 변수
		
		
		char [][] hol = new char[maps.length][maps[0].length()];  // 지도 2차원 배열 데이터
		String [] data = new String[2]; // [좌표,알파엣] 데이터
		
		
//입력값을 2차원배열로 지도 구성
		for(int i=0; i<maps.length; i++) {
			for(int y = 0 ; y<maps[i].length();y++) {
				hol[i][y] = maps[i].charAt(y);
			}
		}
		boolean roop = true;
		while(roop) {
			List<String[]> check = new ArrayList<String[]>(); //좌표 리스트
// 점이아닌 값하나의 좌표를 check 에 입력
			check.clear();
			boolean o = true;
			while(o) {
				for(int y = 0; y<hol.length; y++) {
					for(int x=0; x<hol[y].length;x++) {
						if(hol[y][x]!='.') {
							data[0] = String.valueOf(y)+String.valueOf(x);
							data[1] = Character.toString(hol[y][x]);
							check.add(data.clone());
							System.out.println("들어간 주소:알파벳 = "+data[0]+":"+data[1]);
							hol[y][x] = '.';
							o = false;
						}
						if(!o) {
							break;
						}
					}
					if(!o) {
						break;
					}
				}
			}
			for(int i=0;i<hol.length;i++) {
				System.out.println(hol[i]);
			}
	//지도를 순회하면서 점이아닌 좌표의 상하좌우에 check 값과 일치하는 좌표가 있는지 확인 후 인접해있으면 check에 넣고 점으로 값 변경
			String left, right, up, down;
			boolean ok = true;
			while(ok) {
				ok = false;
				for(int y=0; y<hol.length;y++) {
					for(int x = 0 ; x<hol[y].length;x++) {
						if(hol[y][x] !='.') {
							//상하좌우 좌표확인
							left = String.valueOf(y)+String.valueOf(x-1);
							right = String.valueOf(y)+String.valueOf(x+1);
							up = String.valueOf(y-1)+String.valueOf(x);
							down = String.valueOf(y+1)+String.valueOf(x);
							for(int i=0; i<check.size(); i++) {
								System.out.println(check.get(i)[0]+":"+up);
							//있으면 check에 좌표 추가
								if(check.get(i)[0].equals(left) || check.get(i)[0].equals(right) || check.get(i)[0].equals(up) || check.get(i)[0].equals(down)) {
									String [] ary = new String[2];
									ary[0] = String.valueOf(y)+String.valueOf(x);
									ary[1] = Character.toString(hol[y][x]);
									check.add(ary); //[좌표, 알파벳 값으로 저장]
									ok = true;
									hol[y][x] = '.'; //점으로 변경
								}
								if(ok) {
									break;
								}
							}
						}
					}
				}
			}
			//모든 지도 순회 완료
			//좌표값이 있는 check war(map)에 저장

			war.put("Group"+groupIndex,check);
			for(String[] at : check) {
				System.out.print(at[0]+":"+at[1]+",");
			}
			groupIndex++;
			
		//지도상 모든 데이터가 점이 되었는지 확인
			
			int mapCheck = 0;
			for(int y=0;y<hol.length;y++) {
				for(int x=0;x<hol[y].length;x++) {
					if(hol[y][x] != '.') {
						mapCheck++;
					}
				}
			}		
			if(mapCheck==0) {
				roop = false;
			}
		}
		String warMap = "";
		String[] cont = {"A","B","C","D","E","F","G","H","I","J","K","L","M","N","O","P","Q","R","S","T","U","V","W","X","Y","Z"};
		
		
//전쟁하기
		for(int i = 1; i<groupIndex; i++) {
			String winner = "a";
			ArrayList<String> twin = new ArrayList<String>();
			List<String[]> fight = (ArrayList<String[]>)war.get("Group"+i);
			int top = 0;
			String world = "";
			for(String[] aToz : fight) {
				world = world + aToz[1];
			}
			
				
			for(int y = 0; y<cont.length;y++) {
				int count = 0;
				for(int t = 0; t<world.length(); t++) {
					if(cont[y].charAt(0) == world.charAt(t)) {
							count++;
					}
				}
				if(top<count) {
					top = count;
					winner = cont[y];
				}else if(top==count) {
					int one = cont[y].charAt(0);
					int two = winner.charAt(0);
					if(one>two) {
						twin.add(winner);
						winner = cont[y];
					}
				}
			}
				
//현 상황 표시
			System.out.println("\n"+world);
			System.out.println("winner:"+winner);
			String ex = "";
			for(String aa : twin) {
				ex = ex+ aa;
			}
			
			System.out.println(i+"번쨰 그룹의 제일 많은 단어의 개수:"+top);
			System.out.println("동수나라:"+ex);

			
			
			//바꿔주기 
			if(ex.equals("")) {
				System.out.println(world.replaceAll(".", winner));
				warMap = warMap + world.replaceAll(".", winner);
			}else {
			System.out.println(world.replaceAll("[^"+ex+"]", winner));
			warMap = warMap + world.replaceAll("[^"+ex+"]", winner);
			}
		}
		
		System.out.println(warMap);
		int result = 0;
	//제일 많은 나라 카운트
		for(int i = 0 ; i<cont.length ; i++) {
			int count = 0;
			for(int y = 0 ; y < warMap.length(); y++) {
				if(cont[i].charAt(0) == warMap.charAt(y)) {
					count++;
				}
			}
			if(result<count) {
				result = count;
			}
		}
		System.out.println("제일 많은 나라는:"+result);
		return result;
	}
	

}
}