Java/Java 알고리즘

백준 1063번 킹 JAVA 구현해보기

kimc 2021. 11. 14. 06:47

```

백준 1063번 킹 JAVA 구현해보기

```

이번 글을 통해 배워갈 내용

  1.  백준 1063번 풀이

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

 

1063번: 킹

8*8크기의 체스판에 왕이 하나 있다. 킹의 현재 위치가 주어진다. 체스판에서 말의 위치는 다음과 같이 주어진다. 알파벳 하나와 숫자 하나로 이루어져 있는데, 알파벳은 열을 상징하고, 숫자는

www.acmicpc.net

 

 

 

백준 1063번호번 킹은

난이도 실버 등급의 문제로서

 

8 * 8 크기의 체스판이 주어지고

체스판에 킹의 위치와 돌의 위치가 주어지고

 

명령어에 따라서 킹이 움직이고

킹의 위치가 돌의 위치가 겹치면 조건에 따라서 돌도 움직이는 문제입니다.

 

다시 설명하면

 

Pixabay chessboard

A1 부터 H8까지의 칸을 가진 체스판이 주어질 때

 

킹의 위치, 돌의 위치, 명령의 개수가 한 줄에 주어지고

 

명령은 다음과 같습니다.

R : 한 칸 오른쪽으로
L : 한 칸 왼쪽으로
B : 한 칸 아래로
T : 한 칸 위로
RT : 오른쪽 위 대각선으로
LT : 왼쪽 위 대각선으로
RB : 오른쪽 아래 대각선으로
LB : 왼쪽 아래 대각선으로

 

만약 돌의 위치와 킹의 위치가 같아지면 돌도 킹이 움직이는 방향으로 같이 움직입니다.

다만 돌이나 킹이 움직이려는 위치가 판 밖이면 둘 다 움직이지 않습니다.

 

최종적으로 두 객체의 위치를 출력하면 되는 문제입니다.

 


30분 정도 위에 링크를 방문하셔서 풀어보시고

안 풀리시는 경우에만 아래 해답을 봐주시면 감사하겠습니다.


자바에서 제공하는 POINT를 사용해주고

입력받은 값을 POINT로 바꿔준 다음

    private static Point strPosTo2DPos(String strPos){
        final int xPos = strPos.charAt(0) - 'A';
        final int yPos = strPos.charAt(1) - '1';
        return new Point(xPos, yPos);
    }

 

명령어에 따라서

조건별로 보드 안에 있는지 혹은 돌과 겹치는지에 따라서

돌을 움직여주고 출력해주면 됩니다.

import java.awt.*;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.StringTokenizer;

public class Main {

    static Point kingPos = new Point();
    static Point stonePos = new Point();
    static final int kBoardSize = 7;

    public static void main(String[] args) throws IOException {
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        StringTokenizer st = new StringTokenizer(br.readLine(), " ");

        kingPos = strPosTo2DPos(st.nextToken());
        stonePos = strPosTo2DPos(st.nextToken());
        int moveCnt = Integer.parseInt(st.nextToken());

        for (int i = 0; i < moveCnt; i++) {
            processCommand(br.readLine());
        }

        printPos(kingPos);
        printPos(stonePos);
    }

    private static void printPos(Point point){
        String outputStr = "";
        outputStr += (char)(point.x + 'A');
        outputStr += (char)(point.y + '1');
        System.out.println(outputStr);
    }


    private static Point strPosTo2DPos(String strPos){
        final int xPos = strPos.charAt(0) - 'A';
        final int yPos = strPos.charAt(1) - '1';
        return new Point(xPos, yPos);
    }

    private static boolean isInSideTheBoard(Point objPos, Point posDiff){

        boolean isInside = true;

        if((objPos.x + posDiff.x) > kBoardSize){
            isInside = false;
        } else if((objPos.x + posDiff.x) < 0){
            isInside = false;
        } else if((objPos.y + posDiff.y) > kBoardSize){
            isInside = false;
        } else if((objPos.y + posDiff.y) < 0){
            isInside = false;
        }
        return isInside;
    }

    private static void processCommand(String strCommand){

        Point pointDiff = new Point();

        switch (strCommand)
        {
            case "R":
            {
                pointDiff.x = 1;
                break;
            }
            case "L":
            {
                pointDiff.x = -1;
                break;
            }
            case "B":
            {
                pointDiff.y = -1;
                break;
            }
            case "T":
            {
                pointDiff.y = 1;
                break;
            }
            case "RT":
            {
                pointDiff.x = 1;
                pointDiff.y = 1;
                break;
            }
            case "LT":
            {
                pointDiff.x = -1;
                pointDiff.y = 1;
                break;
            }
            case "RB":
            {
                pointDiff.x = 1;
                pointDiff.y = -1;
                break;
            }
            case "LB":
            {
                pointDiff.x = -1;
                pointDiff.y = -1;
                break;
            }
            default:
            {
                break;
            }
        }

        if(isInSideTheBoard(kingPos, pointDiff)){
            if((stonePos.x == (kingPos.x + pointDiff.x)) && (stonePos.y == (kingPos.y + pointDiff.y))){
                if(isInSideTheBoard(stonePos, pointDiff)){
                    kingPos.setLocation((kingPos.x + pointDiff.x), (kingPos.y + pointDiff.y));
                    stonePos.setLocation((stonePos.x + pointDiff.x), (stonePos.y + pointDiff.y));
                }
            }else {
                kingPos.setLocation((kingPos.x + pointDiff.x), (kingPos.y + pointDiff.y));
            }
        };

    }
}

 

 

읽어주셔서 감사합니다

 

무엇인가 얻어가셨기를 바라며

 

오늘도 즐거운 코딩 하시길 바랍니다 ~ :)

 


 

728x90