エンコードテストの問題を解決しました.
学院で知り合った人がコードテストを見て持ってきた問題なので解けました.
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;
}
}
}Reference
この問題について(エンコードテストの問題を解決しました.), 我々は、より多くの情報をここで見つけました https://velog.io/@lorelime/네이버-클라우드-신입-코딩테스트テキストは自由に共有またはコピーできます。ただし、このドキュメントのURLは参考URLとして残しておいてください。
Collection and Share based on the CC Protocol