Inor

[백준] 1963번 킹 본문

Algorithm/백준

[백준] 1963번 킹

Inor 2018. 1. 11. 14:54

- 문제 : https://www.acmicpc.net/problem/1063


 8x8 체스판 위에 킹과 돌멩이가 있는데 주어진 조건에 맞게 킹과 돌을 옮기는 문제입니다. 입력으로 킹과 돌의 위치와 킹을 움직이는 방향에대한 정보가 주어집니다.




- 풀이


 dRow와 dCol 변수를 선언해서 킹이 다음에 이동할 위치를 설정했습니다. 이동 중에 킹이 체스판 범위를 넘어가면 해당 명령은 무시하도록 했습니다. 그리고 돌의 경우에는 킹과 겹칠 경우에 킹과 같은 방향으로 이동시켰습니다. 조건에 맞게 단순히 이동만 시켜주었습니다. 그러나 처음에 문제를 잘못 이해하고 킹과 돌멩이를 동시에 이동 시켰고 오류가 발생했습니다.(예제로 주어진 조건이 같이 움직이거나 문제의 조건대로 정확히 움직이나 똑같은 결과를 보여줘서 시간이 조금 걸렸습니다..) 역시 시뮬레이션 문제는 조건의 늪에 빠지지 않도록 조건을 미리 정리하고 풀어보는게 좋은 풀이 방법인것 같습니다. 조건은 아래와 같습니다.


1. 킹이 체스판 범위를 넘어가나?

2. 킹과 돌의 위치가 같은가?

3. 돌이 체스판 범위를 넘어가나?

4. 킹과 돌의 위치가 같은가?


 입력 값과 자바에서 사용하는 배열의 인덱스를 정확하게 변환해주는 부분도 이번 문제에서 중요했습니다. 체스판의 범위를 넘어가는 부분에서 킹과 돌의 위치, 이동 방향을 배열의 인덱스로 변환해주면 계산이 더 쉬워집니다. 그래서 처음 입력 받을때 배열의 인덱스에 맞게 변환해줬고 계산이 완료된 뒤에 다시 초기 상태로 변환해서 출력해줬습니다.




- 코드


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

public class King {
	BufferedReader br;
	int n;
	String[] locations;
	int[] directions;
	int[] dRow = { -1, -1, 0, 1, 1, 1, 0, -1 };
	int[] dCol = { 0, 1, 1, 1, 0, -1, -1, -1 };
	int stoneRow, stoneCol, kingRow, kingCol;

	void setValues() {
		String tempStr;
		String[] temps;
		char[] tempChar;
		br = new BufferedReader(new InputStreamReader(System.in));
		try {
			temps = br.readLine().split(" ");
			tempChar = temps[0].toCharArray();
			kingRow = Math.abs(((int) tempChar[1] - 56));
			kingCol = ((int) tempChar[0] - 65);
			tempChar = temps[1].toCharArray();
			stoneRow = Math.abs(((int) tempChar[1] - 56));
			stoneCol = ((int) tempChar[0] - 65);

			n = Integer.parseInt(temps[2]);
			directions = new int[n];
			for (int i = 0; i < n; i++) {
				tempStr = br.readLine();
				switch (tempStr) {
				case "T":
					directions[i] = 0;
					break;
				case "RT":
					directions[i] = 1;
					break;
				case "R":
					directions[i] = 2;
					break;
				case "RB":
					directions[i] = 3;
					break;
				case "B":
					directions[i] = 4;
					break;
				case "LB":
					directions[i] = 5;
					break;
				case "L":
					directions[i] = 6;
					break;
				case "LT":
					directions[i] = 7;
					break;
				}
			}
		} catch (NumberFormatException | IOException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
	}

	public void solve() {
		int moveDirIndex;
		setValues();
		for (int i = 0; i < n; i++) {
			moveDirIndex = directions[i];
			kingRow += dRow[moveDirIndex];
			kingCol += dCol[moveDirIndex];
			if (kingRow < 0 || kingRow >= 8 || kingCol < 0 || kingCol >= 8) {
				kingRow -= dRow[moveDirIndex];
				kingCol -= dCol[moveDirIndex];
			}
			if (kingRow == stoneRow && kingCol == stoneCol) {
				stoneRow += dRow[moveDirIndex];
				stoneCol += dCol[moveDirIndex];
				if (stoneRow < 0 || stoneRow >= 8 || stoneCol < 0 || stoneCol >= 8) {
					stoneRow -= dRow[moveDirIndex];
					stoneCol -= dCol[moveDirIndex];
					if (kingRow == stoneRow && kingCol == stoneCol) {
						kingRow -= dRow[moveDirIndex];
						kingCol -= dCol[moveDirIndex];
					}
				}
			}
		}
		String king = "";
		String stone = "";
		king += (char)(kingCol + 65);
		king +=Math.abs(kingRow - 8);
		stone += (char) (stoneCol + 65);
		stone += Math.abs(stoneRow - 8);
		System.out.println(king);
		System.out.println(stone);
	}

	public static void main(String[] args) {
		King m = new King();
		m.solve();
	}

}


'Algorithm > 백준' 카테고리의 다른 글

[백준] 1992번 쿼드트리  (0) 2018.01.28
[백준] 2573번 빙산  (0) 2018.01.12
[백준] 1932번 숫자 삼각형  (0) 2018.01.10
[백준] 14890번 경사로  (0) 2018.01.03
[백준] 14889번 스타트와 링크  (0) 2017.12.28
Comments