[백준] 1986 체스

알파·2022년 6월 14일
0

Algorithm

목록 보기
11/20

자바로 입력 받는 걸 아직도 헤매고 있다
8방향 델타로 풀었다

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

public class Main {

    static int n;
    static int m;
    static int[][] board;

    static int[] qi = {0, 0, -1, 1, 1, 1, -1, -1};
    static int[] qj = {-1, 1, 0, 0, -1, 1, -1, 1};

    static void qCheck(int i, int j) {
        for(int d = 0; d < 8; d++) {
            int ni = i;
            int nj = j;
            while(true) {
                ni += qi[d];
                nj += qj[d];
                if(ni >= 1 && ni <= n && nj >= 1 && nj <= m && (board[ni][nj] == 0 || board[ni][nj] == -1)){
                    board[ni][nj] = -1;
                } else {
                    break;
                }
            }
        }
    }

    static int[] ki = {-2, -1, 1, 2, -2, -1, 1, 2};
    static int[] kj = {-1, -2, -2, -1, 1, 2, 2, 1};

    static void kCheck(int i, int j) {
        for(int d = 0; d < 8; d++) {
            int ni = i + ki[d];
            int nj = j + kj[d];
            if(ni >= 1 && ni <= n && nj >= 1 && nj <= m && (board[ni][nj] == 0)) {
                board[ni][nj] = -1;
            }
        }
    }

    public static void main(String[] args) throws IOException {
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        StringTokenizer st = new StringTokenizer(br.readLine());
        n = Integer.parseInt(st.nextToken());
        m = Integer.parseInt(st.nextToken());
        board = new int[n+1][m+1];

        st = new StringTokenizer(br.readLine());
        int qCnt = Integer.parseInt(st.nextToken());
        for(int i = 0; i < qCnt; i++) {
            int qi = Integer.parseInt(st.nextToken());
            int qj = Integer.parseInt(st.nextToken());
            board[qi][qj] = 1;
        }

        st = new StringTokenizer(br.readLine());
        int kCnt = Integer.parseInt(st.nextToken());
        for(int i = 0; i < kCnt; i++) {
            int ki = Integer.parseInt(st.nextToken());
            int kj = Integer.parseInt(st.nextToken());
            board[ki][kj] = 2;
        }

        st = new StringTokenizer(br.readLine());
        int pCnt = Integer.parseInt(st.nextToken());
        for(int i = 0; i < pCnt; i++) {
            int pi = Integer.parseInt(st.nextToken());
            int pj = Integer.parseInt(st.nextToken());
            board[pi][pj] = 3;
        }

        for(int i = 1; i <= n; i++) {
            for(int j = 1; j <= m; j++) {
                if(board[i][j] == 1){
                    qCheck(i, j);
                } else if(board[i][j] == 2) {
                    kCheck(i, j);
                }
            }
        }

        int result = 0;
        for(int i = 1; i <= n; i++) {
            for(int j = 1; j <= m; j++) {
                if(board[i][j] == 0) {
                    result++;
                }
            }
        }

        System.out.println(result);
    }
}
profile
I am what I repeatedly do

0개의 댓글