[ BOJ 1063] 킹(Java)

uoayop·2021년 9월 8일
1

알고리즘 문제

목록 보기
100/103
post-thumbnail

문제

https://www.acmicpc.net/problem/1063

어우 킹받아


문제 풀이

각 방향에 따른 이동을 map에 넣어주었다.

Map<String, int[]> dir = new HashMap<>(); ;
String[] str = {"R","L","B","T","RT","LT","RB","LB"};
		int[][] xy = {{0, 1},{0, -1},{1, 0},{-1, 0},{-1, 1},{-1, -1},{1, 1},{1, -1}};
		
for (int i=0; i<8; i++) {
   dir.put(str[i], xy[i]);
}

그리고 킹과 돌의 위치를 저장해 줄 클래스를 만들어주었다.

public static class pos{
	int x;
	int y;
	public pos(int x, int y) {
		this.x = x;
		this.y = y;
	}
}

아래처럼 위치를 나타내서 입력 처리가 조금 더러어려웠다.

현재 위치를 입력 받아 [8][8] 이차원 배열에 저장하기 위해서, x와 y의 위치를 바꾸어 저장해주었다.

pos king = new pos(Math.abs(8-(k[1]-'0')), k[0]-65);
pos rock = new pos(Math.abs(8-(r[1]-'0')), r[0]-65);

그리고 명령을 하나씩 입력 받으면서 아래의 조건을 확인했다.

  1. 다음 칸으로 이동 시 체스판 바깥으로 떨어지는지?
    👉🏻 떨어진다면 해당 명령은 skip
  2. 다음 칸으로 이동했을 때, 돌이 존재하는지?
    👉🏻 다음 칸으로 이동 가능하고, 돌이 존재하지 않는다면 킹의 위치 이동
  3. 돌이 다음 칸으로 이동했을 때 체스판 바깥으로 떨어지진 않는지?
    👉🏻 떨어진다면 해당 명령은 skip
    👉🏻 떨어지지 않는다면 돌과 킹 모두 다음 위치로 이동

코드

import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.util.HashMap;
import java.util.Map;
import java.util.StringTokenizer;

public class BOJ_1063_킹 {
	public static Map<String, int[]> dir;
	public static class pos{
		int x;
		int y;
		public pos(int x, int y) {
			this.x = x;
			this.y = y;
		}
	}
	
	public static void main(String[] args) throws Exception{
		dir = new HashMap<>();
		makedir();
		// 'A' = 65
		
		BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
		StringTokenizer st = new StringTokenizer(br.readLine());
		
		char[] k = st.nextToken().toCharArray();
		char[] r = st.nextToken().toCharArray();
		int n = Integer.parseInt(st.nextToken());
		
		pos king = new pos(Math.abs(8-(k[1]-'0')), k[0]-65);
		pos rock = new pos(Math.abs(8-(r[1]-'0')), r[0]-65);
		
		for (int i=0; i<n; i++) {
			String order = br.readLine();
			
			int dx = dir.get(order)[0];
			int dy = dir.get(order)[1];
			
			int nx = king.x + dx;
			int ny = king.y + dy;
			
			 if (nx < 0 || ny < 0 || 7 < nx || 7 < ny) {
				// 범위 넘어가면 다음 이동
				continue;
			} else if (rock.x == nx && rock.y == ny) {
				// 다음 위치가 돌이랑 같다면
				if (nx + dx < 0 || ny + dy < 0 || 7 < nx + dx || 7 < ny + dy) {
					// 돌의 다음 위치가 범위를 넘어가면 
					continue;
				} else {
					// 돌의 위치가 다음 범위를 넘어가지 않으면
					rock.x += dx; rock.y += dy;
					king.x += dx; king.y += dy;
				}
			} else {
				// 범위 내에 있고, 다음 위치가 돌도 아니라면
				king.x += dx; king.y += dy;
			}

		}
		System.out.printf("%c%d\n",king.y + 65, Math.abs(8-king.x));
		System.out.printf("%c%d\n",rock.y + 65, Math.abs(8-rock.x));
	}
	
	private static void makedir() {
		String[] str = {"R","L","B","T","RT","LT","RB","LB"};
		int[][] xy = {{0, 1},{0, -1},{1, 0},{-1, 0},{-1, 1},{-1, -1},{1, 1},{1, -1}};
		
		for (int i=0; i<8; i++) {
			dir.put(str[i], xy[i]);
		}
	}
}
profile
slow and steady wins the race 🐢

0개의 댓글