알고리즘

백준 1063번 킹 (JAVA)

쿠키담임선생님 2022. 11. 4. 16:51

 

풀이방법


구현문제이다. 조건 식을 추가해야하는데 일단 킹의 위치와 돌의 위치를 문자열 분리하고 형변환을 통해 거기서 좌표값을 추출해 냇다.

그 뒤 해당 좌표를 가지고 상하좌우 + 우상 좌상 우하 좌하 이렇게 움직이는 로직을 짜면된다.

이런 문제는 어디서 벗어날지 모르기 때문에 예외처리를 최대한 꼼꼼하게 해주어야 한다.

아래 코드는 아직 상하좌우만 구현되어있고 정답을 좌표값으로 찍히게끔 만들어 두었는데

이걸 다시 체스좌표로 변환해서 찍어주어야하고 + 대각 방향들 이동 구현을 아직 못했다.

 

22.11.07 추가

자꾸 몇개가 어긋나고 좌표 헷갈리고, row 로 썻는지 col 로 썻는지 2초마다 헷갈려서 중간에 화가 너무 많이 났다.....이래서 구현이 머리가 아프구나........그래도 풀어서 다행이다.

 

코드(완성)


 

package pro;

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.StringTokenizer;

public class test4 {

	private static int[] dx = { -1, 0, 1, 0 };
	private static int[] dy = { 0, 1, 0, -1 };

	public static void main(String[] args) throws IOException {
		BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
		StringTokenizer st = new StringTokenizer(br.readLine());
		String king = st.nextToken(); // king 1 의 위치 A1
		String dol = st.nextToken(); // dol 2 의 위치 A2
		// 위치를 해독해서 어디있는지찾는다

		char colK = king.charAt(0);
		char rowK = king.charAt(1);
		int colKing = colK - 'A';
		int rowKing = 8 - (rowK - '0');

		char colD = dol.charAt(0);
		char rowD = dol.charAt(1);
		int colDol = colD - 'A';
		int rowDol = 8 - (rowD - '0');

		int[][] map = new int[8][8];

		map[rowKing][colKing] = 1; // 킹
		map[rowDol][colDol] = 2; // 돌
		
//		System.out.println("초기위치");
//		for (int o = 0; o < 8; o++) {
//			for (int p = 0; p < 8; p++) {
//				System.out.print(map[o][p] + " ");
//			}
//			System.out.println();
//		}


		int t = Integer.parseInt(st.nextToken());
		for (int i = 0; i < t; i++) {
			String com = br.readLine();
			if (com.equals("B")) { // 아래
				// 아래 범위 가능한지
				if (rowKing + 1 >= 8) {
					continue;
				} else {
					// 아래 돌이 있는지
					if (rowKing + 1 == rowDol && colKing == colDol) {
						// 돌이 있으면 돌부터 옮긴다.
						if (rowDol + 1 >= 8) { // 돌이 범위밖 벗어나면 다음반복
							continue;
						}
						else {
								// 돌옮겨주고
							map[rowDol][colDol] = 0;
							rowDol = rowDol + 1;
							map[rowDol][colDol] = 2;
							// king 옮긴다.
							map[rowKing][colKing] = 0;
							rowKing = rowKing + 1;
							map[rowKing][colKing] = 1;
						}
												
					}else {
						// 없으면 king 아래로한칸이동
						map[rowKing][colKing] = 0;
						rowKing = rowKing + 1;
						map[rowKing][colKing] = 1;
					}
					
				}

			}
			if (com.equals("R")) { // 오른쪽
				if (colKing + 1 >= 8) {
					continue;
				} else {
					// 오른쪽에 돌이 있는지
					if (colKing + 1 == colDol && rowKing == rowDol) {
						// 돌이 있으면 돌부터 옮긴다.
						if (colDol + 1 >= 8) { // 돌이 범위밖 벗어나면 다음반복
							continue;
						}else {
							// 돌옮겨주고
							map[rowDol][colDol] = 0;
							colDol = colDol + 1;
							map[rowDol][colDol] = 2;
							// king 옮긴다.
							map[rowKing][colKing] = 0;
							colKing = colKing + 1;
							map[rowKing][colKing] = 1;	
						}
											
					}else {
						// 없으면 king 오른쪽으로한칸이동
						map[rowKing][colKing] = 0;
						colKing = colKing + 1;
						map[rowKing][colKing] = 1;
					}
					
				}

			}
			if (com.equals("L")) { // 왼쪽
				if (colKing - 1 < 0) {
					continue;
				} else {
					// 왼쪽에 돌이 있는지
					if (colKing - 1 == colDol && rowKing == rowDol) {
						// 돌이 있으면 돌부터 옮긴다.
						if (colDol - 1 < 0) { // 돌이 범위밖 벗어나면 다음반복
							continue;
						}else {
							// 돌옮겨주고
							map[rowDol][colDol] = 0;
							colDol = colDol - 1;
							map[rowDol][colDol] = 2;
							// king 옮긴다.
							map[rowKing][colKing] = 0;
							colKing = colKing - 1;
							map[rowKing][colKing] = 1;
						}
												
					}else {
						// 없으면 king 왼쪽으로한칸이동
						map[rowKing][colKing] = 0;
						colKing = colKing - 1;
						map[rowKing][colKing] = 1;
					}
					
				}

			}
			if (com.equals("T")) { // 위쪽
				// 위쪽 범위 가능한지
				if (rowKing - 1 < 0) {
					continue;
				} else {
					// 아래 돌이 있는지
					if (rowKing - 1 == rowDol && colKing == colDol) {
						// 돌이 있으면 돌부터 옮긴다.
						if (rowDol - 1 < 0) { // 돌이 범위밖 벗어나면 다음반복
							continue;
						}else {
							// 돌옮겨주고
							map[rowDol][colDol] = 0;
							rowDol = rowDol - 1;
							map[rowDol][colDol] = 2;
							// king 옮긴다.
							map[rowKing][colKing] = 0;
							rowKing = rowKing - 1;
							map[rowKing][colKing] = 1;	
						}
											
					}else {
						// 없으면 king 위로한칸이동
						map[rowKing][colKing] = 0;
						rowKing = rowKing - 1;
						map[rowKing][colKing] = 1;
					}
					
				}
			}
			if (com.equals("RT")) {
				// 오른쪽 위 범위 가능한지
				if (rowKing - 1 < 0 || colKing+1 >=8) { //오른쪽 위 한계점.
					continue;
				} else {
					// 오른쪽 위에 돌이 있는지
					if (rowKing - 1 == rowDol && colKing +1 == colDol) {
						// 돌이 있으면 돌부터 오른쪽 위로 옮긴다.
						if (rowDol - 1 < 0 || colDol +1 >=8) { // 돌이 범위밖 벗어나면 다음반복
							continue;
						}else {
							// 돌옮겨주고
							map[rowDol][colDol] = 0;
							rowDol = rowDol - 1;
							colDol = colDol + 1;
							map[rowDol][colDol] = 2;
							// king 옮긴다.
							map[rowKing][colKing] = 0;
							rowKing = rowKing - 1;
							colKing = colKing + 1;
							map[rowKing][colKing] = 1;	
						}
											
					}else {
						//오른쪽 위 돌 없으면 king 오른쪽 위로 한칸 이동
						map[rowKing][colKing] = 0;
						rowKing = rowKing - 1;
						colKing = colKing + 1;
						map[rowKing][colKing] = 1;
					}
					
				}

			}
			if (com.equals("LT")) {
				// 왼쪽 위 범위 가능한지
				if (rowKing - 1 < 0 || colKing-1 < 0) { //왼쪽 위 한계점.
					continue;
				} else {
					// 왼쪽 위에 돌이 있는지
					if (rowKing - 1 == rowDol && colKing -1 == colDol) {
						// 돌이 있으면 돌부터 오른쪽 위로 옮긴다.
						if (rowDol - 1 < 0 || colDol -1 <0) { // 돌이 범위밖 벗어나면 다음반복
							continue;
						}else {
							// 돌옮겨주고
							map[rowDol][colDol] = 0;
							rowDol = rowDol - 1;
							colDol = colDol - 1;
							map[rowDol][colDol] = 2;
							// king 옮긴다.
							map[rowKing][colKing] = 0;
							rowKing = rowKing - 1;
							colKing = colKing - 1;
							map[rowKing][colKing] = 1;	
						}
											
					}else {
						//왼쪽 위 돌 없으면 king 왼쪽 위로 한칸 이동
						map[rowKing][colKing] = 0;
						rowKing = rowKing - 1;
						colKing = colKing - 1;
						map[rowKing][colKing] = 1;
					}
					
				}

			}
			if (com.equals("RB")) {
				// 오른쪽 아래 범위 가능한지
				if (rowKing + 1 >= 8 || colKing+1 >=8) { //오른쪽 위 한계점.
					continue;
				} else {
					// 오른쪽 아래에 돌이 있는지
					if (rowKing + 1 == rowDol && colKing +1 == colDol) {
						// 돌이 있으면 돌부터 오른쪽 아래로 옮긴다.
						if (rowDol + 1 >= 8 || colDol +1 >=8) { // 돌이 범위밖 벗어나면 다음반복
							continue;
						}else {
							// 돌옮겨주고
							map[rowDol][colDol] = 0;
							rowDol = rowDol + 1;
							colDol = colDol + 1;
							map[rowDol][colDol] = 2;
							// king 옮긴다.
							map[rowKing][colKing] = 0;
							rowKing = rowKing + 1;
							colKing = colKing + 1;
							map[rowKing][colKing] = 1;	
						}
											
					}else {
						//범위 밖 벗어나는지 체크
						
						//오른쪽 위 돌 없으면 king 오른쪽 위로 한칸 이동
						map[rowKing][colKing] = 0;
						rowKing = rowKing + 1;
						colKing = colKing + 1;
						map[rowKing][colKing] = 1;
					}
					
				}

			}
			if (com.equals("LB")) {
				// 왼쪽 아래 범위 가능한지
				if (rowKing + 1 >= 8 || colKing-1 < 0) { //왼쪽 위 한계점.
					continue;
				} else {
					// 왼쪽 아래에 돌이 있는지
					if (rowKing + 1 == rowDol && colKing -1 == colDol) {
						// 돌이 있으면 돌부터 왼쪽 아래로 옮긴다.
						if (rowDol + 1 >= 8 || colDol -1 <0) { // 돌이 범위밖 벗어나면 다음반복
							continue;
						}else {
							// 돌옮겨주고
							map[rowDol][colDol] = 0;
							rowDol = rowDol + 1;
							colDol = colDol - 1;
							map[rowDol][colDol] = 2;
							// king 옮긴다.
							map[rowKing][colKing] = 0;
							rowKing = rowKing + 1;
							colKing = colKing - 1;
							map[rowKing][colKing] = 1;	
						}
											
					}else {
						//왼쪽 아래 돌 없으면 king 왼쪽 아래로 한칸 이동
						map[rowKing][colKing] = 0;
						rowKing = rowKing + 1;
						colKing = colKing - 1;
						map[rowKing][colKing] = 1;
					}
					
				}

			}
			
//			StringBuilder sbb = new StringBuilder();
//			sbb.append(i+"번째 반복\n");
//			sbb.append("킹의 위치 : (" + rowKing + "," + colKing+")\n");
//			sbb.append("돌의 위치 : (" + rowDol + "," + colDol+")\n");
//			sbb.append("킹의 위치 : (" + (char)(rowKing+'A') + "" + (8-colKing)+")\n");
//			sbb.append("돌의 위치 : (" + (char)(rowDol+'A') + "" + (8-colDol)+")\n");
//			
//			System.out.println(sbb);
//			for (int o = 0; o < 8; o++) {
//				for (int p = 0; p < 8; p++) {
//					System.out.print(map[o][p] + " ");
//				}
//				System.out.println();
//			}

		}
		StringBuilder sb = new StringBuilder();
		sb.append((char)(colKing+'A')+""+(8-rowKing)+"\n");
		sb.append((char)(colDol+'A')+ ""+(8-rowDol)+"\n");
//		sb.append("킹의 위치 : (" + rowKing + "," + colKing+")\n");
//		sb.append("돌의 위치 : (" + rowDol + "," + colDol+")\n");
		
		System.out.println(sb);
//		for (int i = 0; i < 8; i++) {
//			for (int j = 0; j < 8; j++) {
//				System.out.print(map[i][j] + " ");
//			}
//			System.out.println();
//		}

	}

}
/*
 * A1 A2 5 B L LB RB LT
 */