[Algorithm/Java] 백준 1063번 - 킹
https://www.acmicpc.net/problem/1063
🔍 문제 풀이
문제 도식화
이 문제에서는 y가 행 x가 열임에 주의하자
💻 전체 코드
특정 문자의 좌표는 map으로, 좌표는 x, y 값을 편하게 관리하기 위해 클래스로 처리하자.
import java.io.*;
import java.util.*;
public class Main {
static int kingX, kingY, stoneX, stoneY;
static HashMap<String, Pos> dir = new HashMap<>();
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(); // 킹 위치
String stone = st.nextToken(); // 돌 위치
int n = Integer.parseInt(st.nextToken()); // 움직이는 횟수
// 좌표 변환
kingX = king.charAt(0) - 'A';
kingY = king.charAt(1) - '1';
stoneX = stone.charAt(0) - 'A';
stoneY = stone.charAt(1) - '1';
initDir();
for(int i=0; i<n; i++){
String cmd = br.readLine();
move(cmd);
}
// 체스판 표기로 변환
System.out.println(toStr(kingX, kingY));
System.out.println(toStr(stoneX, stoneY));
}
static void move(String cmd){
Pos d = dir.get(cmd);
int nkx = kingX + d.x;
int nky = kingY + d.y;
if(nkx < 0 || nkx >= 8 || nky < 0 || nky >= 8) return;
// 킹과 돌의 좌표가 같으면 -> 돌도 같은 방향으로 밀기
if (nkx == stoneX && nky == stoneY) {
int nsx = stoneX + d.x;
int nsy = stoneY + d.y;
if (nsx < 0 || nsx >= 8 || nsy < 0 || nsy >= 8) return;
// 둘 다 이동
kingX = nkx;
kingY = nky;
stoneX = nsx;
stoneY = nsy;
}else{
// 킹만 이동
kingX = nkx;
kingY = nky;
}
}
static String toStr(int x, int y){
return (char)('A' + x) + String.valueOf(y + 1);
}
// 방향 벡터 설정
static void initDir(){
dir.put("R", new Pos(1, 0));
dir.put("L", new Pos(-1, 0));
dir.put("B", new Pos(0, -1));
dir.put("T", new Pos(0, 1));
dir.put("RT", new Pos(1, 1));
dir.put("LT", new Pos(-1, 1));
dir.put("RB", new Pos(1, -1));
dir.put("LB", new Pos(-1, -1));
}
static class Pos {
int x;
int y;
Pos(int x, int y){
this.x = x;
this.y = y;
}
}
}
댓글남기기