베오
DCode
베오
전체 방문자
오늘
어제
  • 분류 전체보기 (218)
    • 공지사항 (1)
    • 잡설 (1)
    • Programming (33)
      • [C] (1)
      • [Java] (4)
      • [Python] (2)
      • [Android] (2)
      • [Network] (0)
      • [Operation System] (2)
      • [Spring Boot] (22)
      • [Docker] (0)
    • Algorithm (31)
      • 자료구조 (2)
      • 알고리즘 (Java) (14)
      • 알고리즘 (기초) (15)
    • Coding Test (131)
      • BOJ (131)
      • Algospat (0)
    • 이론적인거 (14)
      • 보안 (5)
      • 오류 해결 (2)
      • 디자인 패턴 (5)
      • 네트워크 (1)
      • 기타 (1)
    • 최신기술 (4)
      • 블록체인 (1)
    • [Project] (1)

블로그 메뉴

  • 🐈‍⬛ GitHub
  • 📫 방명록
  • 🔖 태그

공지사항

인기 글

티스토리

hELLO · Designed By 정상우.
베오

DCode

Coding Test/BOJ

[BOJ/JAVA] 1063번: 킹

2022. 11. 7. 12:58

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

 

1063번: 킹

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

www.acmicpc.net

키워드

  • 킹은 8방향으로 이동한다.
  • 체스판에는 돌이 하나 있는데, 돌과 같은 곳으로 이동할 때는, 돌을 킹이 움직인 방향과 같은 방향으로 한 칸 이동시킨다.
  • 킹이나 돌이 체스판 밖으로 나갈 경우에는 그 이동은 건너 뛰고 다음 이동을 한다.

구현

  • 8방향 이동 Map을 구현한다.
  • 체스판 좌표를 배열 좌표에 매핑시킨다.
  • 배열의 범위를 벗어나는지 확인하는 메소드를 구현한다.
  • 현재 이동하려는 위치에 돌이 있는지 확인한다.
    • 돌이 있으면 돌도 이동시킨다.
      • 돌이 이동할 수 없으면 전체 이동을 스킵한다.
    • 돌이 없으면 킹만 이동시킨다.

코드

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.Map;
import java.util.StringTokenizer;

public class java_1063 {

    final static Map<String, Pair> moveMap = Map.of(
            "L", new Pair(0, -1),
            "R", new Pair(0, 1),
            "B", new Pair(1, 0),
            "T", new Pair(-1, 0),
            "LT", new Pair(-1, -1),
            "RT", new Pair(-1, 1),
            "RB", new Pair(1, 1),
            "LB", new Pair(1, -1));

    static class Pair {
        int y, x;

        public Pair(int y, int x) {
            this.y = y;
            this.x = x;
        }

        @Override
        public String toString() {
            return (char) (x + 'A') + "" + (8 - y);
        }

        @Override
        public boolean equals(Object obj) {
            Pair pairObj = (Pair) obj;
            // TODO Auto-generated method stub
            if (pairObj.y == this.y && pairObj.x == this.x) {
                return true;
            }
            return false;
        }

        public Pair sum(Pair pair) {
            return new Pair(this.y + pair.y, this.x + pair.x);
        }

    }

    static class Item {
        Pair yx;

        public Item(String xy) {

            int y = 8 - (xy.charAt(1) - '0');
            int x = xy.charAt(0) - 'A';

            this.yx = new Pair(y, x);
        }

        @Override
        public String toString() {
            return this.yx.toString();
        }

    }

    static boolean isOutOfRange(Pair yx) {
        int y = yx.y;
        int x = yx.x;

        if (y < 0 || 8 <= y) {
            return true;
        }
        if (x < 0 || 8 <= x) {
            return true;
        }

        return false;
    }

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

        // 이동 시키기
        // 이동할 수 있는지 확인하기
        // 돌을 미는지 확인하기
        StringTokenizer st = new StringTokenizer(br.readLine());

        Item king = new Item(st.nextToken());
        Item stone = new Item(st.nextToken());

        int N = Integer.parseInt(st.nextToken());

        for (int i = 0; i < N; i++) {
            Pair to = moveMap.get(br.readLine());

            Pair kingMove = king.yx.sum(to);

            // 배열 밖으로 나가는지 체크 8*8
            // 킹이 배열 밖으로 나가지 않는다면...
            if (!isOutOfRange(kingMove)) {

                // 킹이 이동하는 위치에 돌이 있는지 확인
                if (kingMove.equals(stone.yx)) {
                    // 돌이 배열 밖으로 나가는지 체크
                    Pair stoneMove = stone.yx.sum(to);
                    // 아니라면 이동시키기
                    if (!isOutOfRange(stoneMove)) {
                        stone.yx = stoneMove;
                        king.yx = kingMove;
                    }
                }
                // 킹만 이동하는 경우
                else {
                    king.yx = kingMove;
                }
            }
        }

        System.out.println(king);
        System.out.println(stone);

    }
}
저작자표시 (새창열림)

'Coding Test > BOJ' 카테고리의 다른 글

[BOJ/JAVA] 20055 컨베이어 벨트 위의 로봇  (0) 2022.11.07
[BOJ/JAVA] 14653번: 너의 이름은  (0) 2022.11.07
[BOJ/JAVA] 20058번: 마법사 상어와 파이어스톰  (0) 2022.11.07
[BOJ/JAVA] 1303번: 전쟁 - 전투  (0) 2022.11.04
[BOJ/JAVA] 17471번: 게리맨더링  (0) 2022.11.04
    'Coding Test/BOJ' 카테고리의 다른 글
    • [BOJ/JAVA] 20055 컨베이어 벨트 위의 로봇
    • [BOJ/JAVA] 14653번: 너의 이름은
    • [BOJ/JAVA] 20058번: 마법사 상어와 파이어스톰
    • [BOJ/JAVA] 1303번: 전쟁 - 전투
    베오
    베오

    티스토리툴바