전체 방문자
오늘
어제
모달조아
Better than yesterday
모달조아
  • 분류 전체보기 (147)
    • PS (86)
      • BOJ (79)
      • 프로그래머스 (6)
    • 이론 (41)
      • 자료구조 (2)
      • 알고리즘 (8)
      • 데이터베이스 (1)
      • 운영체제 (1)
      • 네트워크 (3)
      • 디자인패턴 (7)
      • Java (13)
      • Spring (4)
      • JPA (1)
      • Git (1)
    • 개발 (18)
    • 프로젝트 (1)
    • 기록 (0)
      • 후기 (0)
    • etc (1)

최근 글

티스토리

hELLO · Designed By 정상우.
모달조아

Better than yesterday

PS/BOJ

BOJ 9663 N-Queen [Java]

2022. 2. 13. 23:35

BOJ 9663 N-Queen

1. 문제 링크

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

2. 문제 해설

퀸이 체스판에서 서로 공격할 수 없으려면 3가지 조건을 다 만족해야한다. 같은 행, 같은 열, 대각선 상에 퀸이 존재하면 안된다.
여기서 우리가 퀸을 한 행에는 한개씩만 두기로 해보자. 그렇다면 퀸이 같은 행에 존재하는 경우는 없으므로 조건 중에 1가지는 생각하지 않아도 된다.
1차원 배열을 이용하여서 퀸의 위치를 표현했다. queen[i] = j 라고 하면, i번째 행의 퀸은 j열에 존재한다라는 의미이다.
퀸을 놓는 것은 백트래킹 과정을 이용하여 간단하게 해결가능하다. 23~37줄의 solve 메서드를 살펴보자.
solve 메서드의 매개변수는 r로 현재 행을 의미한다. 그러므로 r == n 이 될 때, solve 메서드를 탈출한다.
r행에 퀸을 i열에 놓았다면 r행의 이전 행에 위치하는 퀸들과 r행 퀸의 위치를 비교하면서 서로 공격할 수 없는지 살펴본다.
공격할 수 없다면 다음 행에도 퀸을 놓는다. (solve 메서드 재귀적으로 호출)

3. 코드 보기

import java.io.*;

public class Main {
    static int n, ans;
    static int[] queen;

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

        n = Integer.parseInt(br.readLine());
        ans = 0;
        queen = new int[n];

        solve(0);

        bw.write(Integer.toString(ans));
        br.close();
        bw.flush();
        bw.close();
    }

    static void solve(int r) {
        if (r == n) {
            ans++;

            return;
        }

        for (int i = 0; i < n; i++) { // r행의 열들을 다 살펴봄.
            queen[r] = i;

            if (isPossible(r)) {
                solve(r + 1);
            }
        }
    }

    static boolean isPossible(int r) { // r행 이전의 행들에 존재하는 퀸들과 r행의 퀸을 비교하여 가능한지 여부 파악
        for (int i = 0; i < r; i++) {
            if (queen[r] == queen[i] || Math.abs(r - i) == Math.abs(queen[r] - queen[i])) {
                return false;
            }
        }

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

'PS > BOJ' 카테고리의 다른 글

BOJ 14891 톱니바퀴 [Java]  (0) 2022.03.14
BOJ 2457 공주님의 정원 [Java]  (0) 2022.03.03
BOJ 11559 Puyo Puyo [Java]  (0) 2022.02.09
BOJ 15686 치킨 배달 [Java]  (0) 2022.02.01
BOJ 1260 DFS와 BFS [Java]  (0) 2022.01.31
    'PS/BOJ' 카테고리의 다른 글
    • BOJ 14891 톱니바퀴 [Java]
    • BOJ 2457 공주님의 정원 [Java]
    • BOJ 11559 Puyo Puyo [Java]
    • BOJ 15686 치킨 배달 [Java]
    모달조아
    모달조아

    티스토리툴바