개발후라이
개발후라이
개발후라이
  • 분류 전체보기 (287)
    • Web Front End (76)
      • Javascript & Typescript (26)
      • React (12)
      • Vue (4)
      • Nodejs (1)
      • HTML (6)
      • CSS (8)
      • HTTP (6)
      • 책 - Review (8)
    • TIL (0)
    • Problem Solved (135)
      • 알고리즘 (4)
      • BOJ (67)
      • Programmers (8)
      • HackerRank (33)
      • LeetCode (23)
    • 회고 (4)
      • 오늘의 회고 (16)
      • 주간 회고 (15)
      • 월간 회고 (7)
      • WakaTime (9)
    • Git (3)
    • 기타 (15)
      • 취업 (5)
      • 자격증 (1)

블로그 메뉴

  • GitHub
  • LinkedIn
  • 홈

인기 글

태그

  • 자바스크립트
  • 노마드북클럽
  • 릿코드
  • JavaScript
  • TypeScript
  • 오늘의회고
  • 개발자
  • 프론트엔드
  • 노개북
  • 회고

최근 댓글

최근 글

전체 방문자
오늘
어제

티스토리

hELLO · Designed By 정상우.
개발후라이

개발후라이

Problem Solved/BOJ

[BOJ][Java] 9663번 - N-Queen

2019. 12. 29. 01:08
반응형

문제

백준 9663번 문제: N-Queen

문제 설명

  • 한줄에 하나의 Queen만 존재 가능하므로 1차원 배열 선언

  • N+1크기의 배열을 선언한 후 재귀로 경우의 수를 구한다.

  • int array는 선언 시 0으로 초기화되므로 배열 요소가 1부터 시작하도록 한다.

    array를 0부터 채웠을 때 문제점은 아래의 표를 보면 알 수 있다.
    0으로 시작했을 때 디버깅한 것을 보면 값이 중복되어 들어간다. arr[i] == arr[row] 조건에 걸려 false가 리턴되었기 때문이다.

  • 조건 1. 같은 열에 있거나

  • 조건 2. 대각선에 위치할 경우를 제외하고 찾는다.

    • 대각선에 위치하기 위한 조건

      (기준 x좌표 값 - 대각선 x좌표값)의 절대값 == (기준 y좌표 값 - 대각선 y좌표값)의 절대값
      x의 좌표값끼리의 절대값과
      y의 좌표값끼리의 절대값이
      같아야 한다

  • 참고: [Java] 백준9663 N-Queen

성공 코드


import java.util.Scanner;

public class Main {  
static int cnt = 0;


  public static void main(String[] args) {
      Scanner sc = new Scanner(System.in);
      int n = sc.nextInt();
      sc.close();
      /* 
       * 한줄에 하나의 Queen만 존재 가능하므로 1차원 배열 선언
       * N+1크기의 배열을 선언한 후 재귀로 경우의 수를 구한다.
       * int array는 선언 시 0으로 초기화되므로 배열 요소가 1부터 시작하도록 한다.
       */        
      for (int i = 1; i <= n; i++) {
          int array[] = new int[n+1];

          array[1] = i;
          nQueen(array, 1);
      }
      System.out.println(cnt);
  }

  public static void nQueen(int array[], int row) {

      if (row == array.length-1) {
          cnt++;
      }
      else {
          for (int i = 1; i < array.length; i++) {
              array[row+1] = i;

              if (isPossible(array, row+1)) 
                  nQueen(array, row+1);
          }
      }
  }

  /*    
   * 조건 1. 같은 열에 있거나
   * 조건 2. 대각선에 위치할 경우를 제외하고 찾는다.
   */
  public static boolean isPossible(int[] arr, int row) {
      for (int i = 1; i < row; i++) {
          if (arr[i] == arr[row] ||
                  Math.abs(i-row) == Math.abs(arr[i]-arr[row])) 
              return false;
      }

      return true;
  }


}
반응형
저작자표시 (새창열림)
    'Problem Solved/BOJ' 카테고리의 다른 글
    • [BOJ][Java] 2748번 - 피보나치 수 2
    • [BOJ][Java] 2747번 - 피보나치 수
    • [BOJ][Java] 15652번 - N과 M (4)
    • [BOJ][Java] 15651번 - N과 M (3)
    개발후라이
    개발후라이
    어제보다 오늘 발전하기 위한 공간 https://github.com/choisohyun

    티스토리툴바