https://www.acmicpc.net/problem/1063
Prob) king 또는 stone의 위치를 구하는 알고리즘을 따로 함수로 빼놓는 방법이 고민이 되었다. 리턴값은 행,열의 위치 2개이기 때문이다.
Sol) 2개의 값을 c*10 + r 의 형식으로 합쳐서 리턴
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.StringTokenizer;
public class Main {
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());
int c1 = king.charAt(0) - 'A';
int r1 = king.charAt(1) - '0';
int c2 = stone.charAt(0) - 'A';
int r2 = stone.charAt(1) - '0';
int tmp;
while (n-- > 0) {
String dir = br.readLine();
int prev_c1 = c1;
int prev_r1 = r1;
tmp = chess(c1, r1, dir);
c1 = tmp / 10;
r1 = tmp % 10;
if (c1 == c2 && r1 == r2) {
tmp = chess(c2, r2, dir);
c2 = tmp / 10;
r2 = tmp % 10;
if (c1 == c2 && r1 == r2) {
c1 = prev_c1;
r1 = prev_r1;
}
}
}
StringBuilder sb = new StringBuilder();
sb.append((char)('A' + c1)).append(r1).append('\n');
sb.append((char)('A' + c2)).append(r2);
System.out.println(sb);
}
public static int chess(int c, int r, String dir) {
if (dir.equals("R")) {
c++;
if (c > 7)
c--;
}
else if (dir.equals("L")) {
c--;
if (c < 0)
c++;
}
else if (dir.equals("B")) {
r--;
if (r < 1)
r++;
}
else if (dir.equals("T")) {
r++;
if (r > 8)
r--;
}
else if (dir.equals("RT")) {
c++;
r++;
if (c > 7 || r > 8) {
c--;
r--;
}
}
else if (dir.equals("LT")) {
c--;
r++;
if (c < 0 || r > 8) {
c++;
r--;
}
}
else if (dir.equals("RB")) {
c++;
r--;
if (c > 7 || r < 1) {
c--;
r++;
}
}
else if (dir.equals("LB")) {
c--;
r--;
if (c < 0 || r < 1) {
c++;
r++;
}
}
return c*10 + r;
}
}
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.StringTokenizer;
public class Main {
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());
int c1 = king.charAt(0) - 'A';
int r1 = king.charAt(1) - '0';
int c2 = stone.charAt(0) - 'A';
int r2 = stone.charAt(1) - '0';
int[] pos;
while (n-- > 0) {
String dir = br.readLine();
int prev_c1 = c1;
int prev_r1 = r1;
pos = new int[]{c1, r1};
move(pos, dir);
if (!validator(pos))
continue;
c1 = pos[0];
r1 = pos[1];
if (c1 == c2 && r1 == r2) {
pos[0] = c2;
pos[1] = r2;
move(pos, dir);
if (!validator(pos)) {
c1 = prev_c1;
r1 = prev_r1;
continue;
}
c2 = pos[0];
r2 = pos[1];
}
}
StringBuilder sb = new StringBuilder();
sb.append((char)('A' + c1)).append(r1).append('\n');
sb.append((char)('A' + c2)).append(r2);
System.out.println(sb);
}
public static void move(int[] pos, String dir) {
switch(dir) {
case "R":
pos[0]++;
break;
case "L":
pos[0]--;
break;
case "B":
pos[1]--;
break;
case "T":
pos[1]++;
break;
case "RT":
pos[0]++;
pos[1]++;
break;
case "LT":
pos[0]--;
pos[1]++;
break;
case "RB":
pos[0]++;
pos[1]--;
break;
case "LB":
pos[0]--;
pos[1]--;
break;
}
}
public static boolean validator(int[] pos) {
if (pos[0] < 0 || pos[0] > 7 || pos[1] < 1 || pos[1] > 8)
return false;
else return true;
}
}
validator
함수를 따로 생성하여 체크메모리와 시간은 위의 코드와 큰 차이는 없다.