백준 1063 킹[Java]

seren-dev·2022년 5월 21일
0

https://www.acmicpc.net/problem/1063

접근

  • 각 명령어마다 king의 위치를 구한다.
  • 그 다음, 이동한 king의 위치가 stone의 위치와 같을 경우 stone도 이동시킨다.
  • stone의 위치를 이동시킬 수 없을 경우 king의 위치를 다시 원래대로 돌려놓는다.

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;
    }
}
  • 위의 chess 함수를 switch를 사용하도록 변경
  • 함수명 move로 변경
  • 파라미터를 int가 아닌 int 배열로 변경하여 리턴값이 없도록 함
  • 체스판 밖으로 나가는 경우에 대해서는 validator 함수를 따로 생성하여 체크

메모리와 시간은 위의 코드와 큰 차이는 없다.

0개의 댓글