누룽지맛치킨
어미새의 개발일지
누룽지맛치킨
전체 방문자
오늘
어제
  • 분류 전체보기 (86)
    • 코틀린 (8)
    • 안드로이드 (5)
      • 디자인 (2)
      • 개발 (2)
      • 도구 (1)
    • 피그마 (1)
    • 대외활동 (0)
    • 프로젝트 (0)
    • 백준 (55)
      • JAVA (55)
    • 알고리즘 (3)
    • 클라우드 (5)
    • 스터디 (2)
      • 코테 (2)
    • 자료구조 (5)
    • 컴퓨터 기술 (1)

블로그 메뉴

  • 홈
  • 태그
  • 방명록

공지사항

인기 글

태그

  • 알고리즘 조합
  • 코틀린 runBlocking
  • Room Migration
  • 백준 자바 수열
  • 백준 자바
  • 클라우드
  • Room version 올리기
  • 안드로이드 디자인
  • 안드로이드
  • 자바 Priority Queue
  • 백준 자바 누적합
  • 자료구조
  • 백준 자바 2559번
  • 코틀린
  • 백준 자바 2292번
  • 코틀린 인 액션
  • 백준 자바 다이나믹 프로그래밍
  • 백준 자바 벌집
  • 클라우드 컴퓨팅
  • 백준 자바 정렬

최근 댓글

최근 글

티스토리

hELLO · Designed By 정상우.
누룽지맛치킨

어미새의 개발일지

백준/JAVA

[백준/JAVA] 9663번 N-Queen

2023. 2. 10. 14:34
  • 조금 더 복잡한 백트래킹 문제 1
    https://www.acmicpc.net/problem/9663

1. 문제

N-Queen 문제는 크기가 N × N인 체스판 위에 퀸 N개를 서로 공격할 수 없게 놓는 문제이다.

N이 주어졌을 때, 퀸을 놓는 방법의 수를 구하는 프로그램을 작성하시오.

2. 문제 접근

1) 첫째 줄에 체스판의 크기 N을 입력받는다.
2) 퀸이 공격할 수 없으려면 한 행에 한개씩 두어야한다.
3) 백트래킹 알고리즘을 사용하여 depth를 행으로 생각, 0부터 N-1까지 반복하며 열을 선택한다.
4) 이때, 열, 2개의 방향의 대각선에 겹치면 안되기 때문에 체크를 하는 boolean형 배열 3개를 선언한다.
5) 열, 2개의 방향의 대각선 모두 겹치지 않을 때 백트래킹 함수를 실행하고 각 체크 배열의 값을 true로 설정한다.
6) 지정한 깊이까지 도달한 경우는 겹치지 않는 경우로 경우의 수를 1 증가시킨다.
7) 모든 경우의 수를 탐색한 후 경우의 수를 출력한다.

3. 코드

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

public class Main {
    static int N;
    static int result = 0;
    static boolean side1[];
    static boolean side2[];
    static boolean column[];
    public static void main(String[] args) throws IOException{
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        N = Integer.parseInt(br.readLine());

        column = new boolean[N];
        side1 = new boolean[2*N-1];
        side2 = new boolean[2*N-1];

        back(0);
        System.out.println(result);
    }

    static void back(int depth){
        if(depth==N){
            result++;
            return;
        }
        for(int i=0;i<N;i++){
            if(!column[i] && !side1[depth-i+N-1] && !side2[depth+i]){
                column[i] = true;
                side1[depth-i+N-1] = true;
                side2[depth+i] = true;
                back(depth+1);
                column[i] = false;
                side1[depth-i+N-1] = false;
                side2[depth+i] = false;
            }
        }
    }
}

'백준 > JAVA' 카테고리의 다른 글

[백준/JAVA] 1764번 듣보잡  (0) 2023.02.14
[백준/JAVA] 9184번 신나는 함수 실행  (0) 2023.02.10
[백준/JAVA] 14889번 스타트와 링크  (0) 2023.02.10
[백준/JAVA] 14888번 연산자 끼워넣기  (0) 2023.02.10
[백준/JAVA] 15650번 N과 M(2)  (0) 2023.02.10
    '백준/JAVA' 카테고리의 다른 글
    • [백준/JAVA] 1764번 듣보잡
    • [백준/JAVA] 9184번 신나는 함수 실행
    • [백준/JAVA] 14889번 스타트와 링크
    • [백준/JAVA] 14888번 연산자 끼워넣기
    누룽지맛치킨
    누룽지맛치킨

    티스토리툴바