풀이
- 우선 좌표에 대한 dictionary를 미리 만들어두어 간단하게 방향을 찾을 수 있도록 함.
- 이후 킹과 돌의 좌표값을 확인한 이후 주어지는 방향에 따른 조건 분기 처리를 하여 좌표 이동을 시킴
- 여기서 조금 코드가 길어진 부분은 킹은 움직일 수 있지만 돌이 더이상 이동할 범위를 벗어날 경우에 대한 부분으로
- 물론 더 좋은 코드가 있겠지만 아래와 같이 해결.
추가 학습
- 우선 파이썬의 dictionary는 HashMap으로 만들며 만드는 동시에 기본값을 넣는 건
안되는건지 우선 아래와 같이 따로 하나식 추가 함. - 그리고 substring으로 인자 하나만 넣을 경우 그냥 해당 인덱스에 대한 값을 가져오는 것.
계속 beginIndex라고 나오니까 헷갈렸음... - 그리고 붙어있는 문자 중 숫자를 가져올 때는 substring()으로, 문자는 charAt()으로 가져와야 함.
- 그리고 ArrayList에서 set을 할 때 첫 번째 인자는 index, 두 번째 인자는 값인 것을 기억하기.
import java.io.*;
import java.util.*;
public class 킹 {
public static void main(String[] args) throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
HashMap<String, Integer[]> move = new HashMap<>();
move.put("T", new Integer[]{1, 0});
move.put("B", new Integer[]{-1, 0});
move.put("L", new Integer[]{0, -1});
move.put("R", new Integer[]{0, 1});
move.put("LT", new Integer[]{1, -1});
move.put("RT", new Integer[]{1, 1});
move.put("LB", new Integer[]{-1, -1});
move.put("RB", new Integer[]{-1, 1});
StringTokenizer st1 = new StringTokenizer(br.readLine());
String k = st1.nextToken();
String s = st1.nextToken();
String n = st1.nextToken();
ArrayList<Integer> k_pos = new ArrayList<>(Arrays.asList(Integer.parseInt(k.substring(1)), (int) k.charAt(0) - 64));
ArrayList<Integer> s_pos = new ArrayList<>(Arrays.asList(Integer.parseInt(s.substring(1)), (int) s.charAt(0) - 64));
for (int i = 0; i < Integer.parseInt(n); i++) {
StringTokenizer st2 = new StringTokenizer(br.readLine());
Integer[] next = move.get(st2.nextToken());
if ((1 <= k_pos.get(0) + next[0] && k_pos.get(0) + next[0] <= 8) && 1 <= k_pos.get(1) + next[1] && k_pos.get(1) + next[1] <= 8) {
if ((k_pos.get(0) + next[0] == s_pos.get(0) && k_pos.get(1) + next[1] == s_pos.get(1)) && ((1 <= s_pos.get(0) + next[0] && s_pos.get(0) + next[0] <= 8) && 1 <= s_pos.get(1) + next[1] && s_pos.get(1) + next[1] <= 8)) {
s_pos.set(0, s_pos.get(0) + next[0]);
s_pos.set(1, s_pos.get(1) + next[1]);
} else if ((k_pos.get(0) + next[0] == s_pos.get(0) && k_pos.get(1) + next[1] == s_pos.get(1)) && !((1 <= s_pos.get(0) + next[0] && s_pos.get(0) + next[0] <= 8) && 1 <= s_pos.get(1) + next[1] && s_pos.get(1) + next[1] <= 8)) {
continue;
}
k_pos.set(0, k_pos.get(0) + next[0]);
k_pos.set(1, k_pos.get(1) + next[1]);
}
}
// 마지막 출력
System.out.print((char) (k_pos.get(1) + 64));
System.out.println(k_pos.get(0));
System.out.print((char) (s_pos.get(1) + 64));
System.out.println(s_pos.get(0));
}
}
'알고리즘' 카테고리의 다른 글
[백준, 자바, 1138번] 한 줄로 서기 (0) | 2023.12.26 |
---|---|
[백준, 파이썬, 1138번] 한 줄로 서기 (0) | 2023.12.26 |
[백준, 파이썬, 1063번] 킹 (0) | 2023.12.22 |
[백준, 파이썬, 1059번] 좋은 구간 (0) | 2023.12.21 |
[백준, 자바, 1059번] 좋은 구간 (0) | 2023.12.21 |