알고리즘

[백준, 자바, 1063번] 킹

hminor 2023. 12. 22. 13:30

풀이

  • 우선 좌표에 대한 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));
    }
}