본문 바로가기

알고리즘(백준 등) 공부

SWEA 15612. 체스판 위의 룩 배치

8 x 8 체스판에 정확히 룩 8개가 서로 공격할 수 없게 놓여 있는지 확인하는 문제이다.

 

체스판 정보를 받으면서 룩의 위치를 저장한다. 8개인지 확인하고 아니라면 조건을 만족하지 않게 된다.

List<int[]> rooks = new ArrayList<>();
for(int i=0; i<8; i++) {
    board[i] = br.readLine().toCharArray();
    for(int j=0; j<8; j++) {
        if(board[i][j] == 'O') {
            rooks.add(new int[] {i, j});
        }
    }
}
if(rooks.size() != 8) {
    sb.append("no").append('\n');
    continue;
}

 

 

공격 가능 여부는 가로 세로에 다른 룩이 존재하는지 확인하여 없으면 가능하고 하나라도 있으면 불가능하다.

private static boolean isValidRook(int[] rook) {
    for(int i=1; i<8; i++) {
        int nr = (rook[0]+i) % 8, nc = (rook[1]+i) % 8;
        if(board[nr][rook[1]] == 'O') return false;
        if(board[rook[0]][nc] == 'O') return false;
    }
    return true;
}
for(int[] rook: rooks) {
    if(!isValidRook(rook)) {
        sb.append("no").append('\n');
        continue outer;
    }
}

 

 

결과 코드는 다음과 같다.

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.ArrayList;
import java.util.List;

public class Solution {
    static char[][] board = new char[8][8];;
    
    public static void main(String[] args) throws IOException {
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        int T = Integer.parseInt(br.readLine());
        StringBuilder sb = new StringBuilder();

        outer: for (int tc = 1; tc <= T; tc++) {
            sb.append('#').append(tc).append(' ');
            List<int[]> rooks = new ArrayList<>();
            for(int i=0; i<8; i++) {
                board[i] = br.readLine().toCharArray();
                for(int j=0; j<8; j++) {
                    if(board[i][j] == 'O') {
                        rooks.add(new int[] {i, j});
                    }
                }
            }
            if(rooks.size() != 8) {
                sb.append("no").append('\n');
                continue;
            } else {
                for(int[] rook: rooks) {
                    if(!isValidRook(rook)) {
                        sb.append("no").append('\n');
                        continue outer;
                    }
                }
            }
            sb.append("yes").append('\n');
        }
        
        br.close();
        System.out.print(sb);
    }
    
    private static boolean isValidRook(int[] rook) {
        for(int i=1; i<8; i++) {
            int nr = (rook[0]+i) % 8, nc = (rook[1]+i) % 8;
            if(board[nr][rook[1]] == 'O') return false;
            if(board[rook[0]][nc] == 'O') return false;
        }
        return true;
    }
}

'알고리즘(백준 등) 공부' 카테고리의 다른 글

SWEA 14692. 통나무 자르기  (0) 2026.05.10
SWEA 15230. 알파벳 공부  (0) 2026.05.09
SWEA 15758. 무한 문자열  (0) 2026.05.07
SWEA 15942. 외계인 침공  (0) 2026.05.06
SWEA 16002. 합성수 방정식  (0) 2026.05.05