티스토리 뷰

알고리즘/문제

백준 1063 킹

0307kjb 2024. 12. 23. 16:34

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

 

import java.util.Scanner;

public class Main
{
    static final int COL = 0;
    static final int ROW = 1;
    static final int FIRST = 1;
    static final int END = 8;
    static final int SIZE = 9;
    static final char COL_CHARACTER = 'A';
    static final char ROW_CHARACTER = '1';

    public static void main (final String[] args)
    {
        Scanner sc = new Scanner(System.in);

        char[] kingPosition = sc.next()
                                .toCharArray();
        char[] stonePosition = sc.next()
                                 .toCharArray();
        int moveCount = sc.nextInt();

        for (int i = 0; i < moveCount; i++)
        {
            String action = sc.next();
            move(kingPosition, stonePosition, action);
        }

        System.out.println(kingPosition);
        System.out.println(stonePosition);

        sc.close();
    }

    private static void move (final char[] kingPosition,
                              final char[] stonePosition,
                              final String action)
    {
        int[][] directions = { { 1, 0 }, { -1, 0 }, { 0, -1 }, { 0, 1 }, { 1, 1 }, { -1, 1 }, { 1, -1 }, { -1, -1 } };

        String[] actions = { "R", "L", "B", "T", "RT", "LT", "RB", "LB" };

        for (int i = 0; i < actions.length; i++)
        {
            if (actions[i].equals(action))
            {
                int dx = directions[i][0];
                int dy = directions[i][1];

                if (isValidMove(kingPosition, dx, dy) == true)
                {
                    if (isSamePosition(kingPosition, stonePosition, dx, dy) == true)
                    {
                        if (isValidMove(stonePosition, dx, dy) != true)
                        {
                            break;
                        }
                        updatePosition(stonePosition, dx, dy);
                    }
                    updatePosition(kingPosition, dx, dy);
                }

                break;
            }
        }
    }

    private static boolean isValidMove (final char[] position,
                                        final int dx,
                                        final int dy)
    {
        int newCol = position[COL] - COL_CHARACTER + 1 + dx;
        int newRow = position[ROW] - ROW_CHARACTER + 1 + dy;
        return (newCol >= FIRST && newCol <= END && newRow >= FIRST && newRow <= END);
    }

    private static boolean isSamePosition (final char[] kingPosition,
                                           final char[] stonePosition,
                                           final int dx,
                                           final int dy)
    {
        return kingPosition[COL] + dx == stonePosition[COL] && kingPosition[ROW] + dy == stonePosition[ROW];
    }

    private static void updatePosition (final char[] position,
                                        final int dx,
                                        final int dy)
    {
        position[COL] += dx;
        position[ROW] += dy;
    }

}
댓글
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
«   2025/04   »
1 2 3 4 5
6 7 8 9 10 11 12
13 14 15 16 17 18 19
20 21 22 23 24 25 26
27 28 29 30
글 보관함