[필수 문제] rook

2021. 2. 12. 23:16코딩 테스트/필수 문제

1. 문제

체스에서 룩이라는 기물은 막혀있지만 않으면 룩의 위치에서 같은 행, 같은 열에 해당하는 칸 중 하나로 한 번 이동할 수 있다. 단, 특정 칸이 막혀있다면 그 칸에서부터 더 나아갈 수는 없다. 만약 룩이 아래 그림과 같이 5행 4열에 존재하고 같은 행열에 기물이 없다면 5행이나 4열에 존재하는 칸 중 어디로든 갈 수 있다. 예를 들어, 5행 2열 혹은 1행 4열로 움직일 수 있다. 차례에 주어진 이동 횟수는 한 번이므로 이동이 완료되었다면 상대방의 차례로 넘어간다.

체스는 킹만 잡히면 지게 되는 게임이다. 그 중에서도 알랩이는 룩으로 인해 게임을 지는 것을 극도로 싫어한다!

주어진 체스판의 상태에서 현재 차례가 상대의 차례일 때, 이번 차례에 알랩이의 킹이 상대방의 룩에게 잡힐 가능성이 있는지 알아보자.


입력

8줄에 걸쳐 8x8 체스판의 상태가 주어진다. 이때 0은 기물이 없는 상태이고, 1은 알랩이의 킹을 의미하고, 2는 상대의 룩을 의미하며 3은 그 외 다른 기물들을 의미한다. (킹은 하나만 존재하며, 상대의 룩은 최대 2개까지 있을 수 있다. 그 외 기물들은 최대 29개까지 있을 수 있다.)

출력

킹이 룩에게 잡힐 가능성이 있으면 1, 아니면 0을 출력한다.

예제 입력

case 1)

0 3 0 0 0 0 0 0
3 1 0 0 0 0 2 0
0 3 0 0 0 0 0 0
0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0

 

case 2)

0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0
0 3 3 0 0 0 0 0
3 0 1 0 3 0 2 0
0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0

예제 출력

case 1) 1

case 2) 0

 

 

 

2. 풀이

이 문제는 킹과 룩의 위치를 파악한 뒤, 킹과 룩이 같은 행 혹은 열에 있을 경우 킹과 룩 사이에 장애물이 있다면 0을, 장애물이 없다면 1을 출력해주면 된다. 단, 룩이 2개 존재할 수 있다는 점을 주의해야한다. (같은 행 혹은 열에 킹과 룩이 없다면 0 출력)

import java.io.*;
import java.util.StringTokenizer;

class Point {
    private int y;
    private int x;

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

    public int getY() {
        return y;
    }

    public int getX() {
        return x;
    }

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

public class Main {

    private static final BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
    private static final BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(System.out));

    public static void main(String[] args) throws IOException {

        Point king = new Point(0, 0);
        Point[] rook = new Point[2];
        rook[0] = new Point(0, 0);
        rook[1] = new Point(0, 0);
        int rookCount = 0;

        int[][] arr = new int[8][8];
        StringTokenizer st;
        for(int i = 0; i < 8; i++) {
            st = new StringTokenizer(br.readLine());
            for(int j = 0; j < 8; j++) {
                arr[i][j] = Integer.parseInt(st.nextToken());

                if(arr[i][j] == 1) king.setYX(i, j);
                else if(arr[i][j] == 2) rook[rookCount++].setYX(i, j);
            }
        }

        int result = 0;
        for(int i = 0; i < 2; i++) {
            if(king.getY() == rook[i].getY()) { // 같은 행에 있을 경우, 킹과 룩 사이의 장애물 존재 유무 확인
                int min = Math.min(king.getX(), rook[i].getX());
                int max = Math.max(king.getX(), rook[i].getX());
                for(int j = min; j < max; j++) {
                    if(arr[king.getY()][j] == 3) { // 장애물이 있을 경우
                        result = 0;
                        break;
                    } else result = 1;
                }
            } else if(king.getX() == rook[i].getX()) { // 같은 열에 있을 경우, 킹과 룩 사이의 장애물 존재 유무 확인
                int min = Math.min(king.getY(), rook[i].getY());
                int max = Math.max(king.getY(), rook[i].getY());
                for(int j = min; j < max; j++) {
                    if(arr[j][king.getX()] == 3) { // 장애물이 있을 경우
                        result = 0;
                        break;
                    } else result = 1;
                }
            }
        }

        bw.write(result + "");

        br.close();
        bw.flush();
        bw.close();
    }

}
728x90

'코딩 테스트 > 필수 문제' 카테고리의 다른 글

[필수 문제] class president  (0) 2021.02.12
[필수 문제] attackrange  (0) 2021.02.12
[필수 문제] maxofarr  (0) 2021.02.12
[필수 문제] GCD LCM  (0) 2021.02.12