https://www.acmicpc.net/problem/1063
import java.util.*;
import java.io.*;
class Main {
static final int MAX_SIZE = 8;
static final int KING = 0;
static final int STONE = 1;
static Map<String, Pos> direction = new HashMap<>();
public static void main(String[] args) throws Exception {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
StringTokenizer st = new StringTokenizer(br.readLine());
Pos[] poses = new Pos[2];
for (int i = 0; i < 2; i++) {
char[] input = st.nextToken().toCharArray();
poses[i] = new Pos(input[0] - 'A' + 1, input[1] - '0');
}
initializeDirection();
int N = Integer.parseInt(st.nextToken());
for (int i = 0; i < N; i++) {
// 방향 구하기
String dir = br.readLine();
int dx = direction.get(dir).x;
int dy = direction.get(dir).y;
// 다음 좌표
int nx = poses[KING].x + dx;
int ny = poses[KING].y + dy;
// 범위 벗어나면 건너뜀.
if (!(1 <= nx && nx <= MAX_SIZE) || !(1 <= ny && ny <= MAX_SIZE)) {
continue;
}
// 움직일 위치에 돌이 있다면 돌을 밀어냄.
if (nx == poses[STONE].x && ny == poses[STONE].y) {
int snx = poses[STONE].x + dx;
int sny = poses[STONE].y + dy;
// 돌이 범위를 벗어나면 건너뜀.
if (!(1 <= snx && snx <= MAX_SIZE) || !(1 <= sny && sny <= MAX_SIZE)) {
continue;
}
poses[STONE].x = snx;
poses[STONE].y = sny;
}
// 다음 좌표로 돌 갱신하기
poses[KING].x = nx;
poses[KING].y = ny;
}
System.out.println(poses[KING]);
System.out.println(poses[STONE]);
}
static void initializeDirection() {
direction.put("R", new Pos(1, 0));
direction.put("L", new Pos(-1, 0));
direction.put("B", new Pos(0, -1));
direction.put("T", new Pos(0, 1));
direction.put("RT", new Pos(1, 1));
direction.put("LT", new Pos(-1, 1));
direction.put("RB", new Pos(1, -1));
direction.put("LB", new Pos(-1, -1));
}
static class Pos {
int x;
int y;
Pos(int x, int y) {
this.x = x;
this.y = y;
}
@Override
public String toString() {
// return String.format("%d %d", x, y);
return String.format("%c%d", x + 'A' - 1, y);
}
}
}
A ~ H
, 세로축은 1~8
까지 존재한다.x, y
축을 묶어서 관리할 수 있도록 Pos
객체를 생성하였다.Character, Pos
를 맵핑하여 저장한다. Pos
는 이동 방향을 나타낸다. 0-base
로 맞출 필요가 없다. 이 문제의 경우는 1-base
로 하여 문제에 나온 그대로 조건을 검사하는 것이 훨씬 직관적이고 이해하기 쉽다.예제 입력2
에서 계속 이동이 걸렸었다.int ny = poses[KING].y + dy;
이런 형태의 코드를 nx
갱신 코드에서 복붙해서 넣었는데, 값을 안바꾸고 넣었다. 역시 이것 때문에 많은 시간을 디버깅에 사용했다.Pos배열
이 아니라 각각의 Pos
객체로 관리하는 것이 훨씬 가독성이 좋아보인다.