HelloMinchan
처음처럼
HelloMinchan
LinkedIn
전체 방문자
오늘
어제
  • 분류 전체보기 (306)
    • Backend (4)
      • NestJS (1)
      • Express (1)
      • Spring (2)
    • Infrastructure (1)
      • AWS (1)
    • Frontend (1)
      • Next.js (1)
    • Language & Runtime (4)
      • Java (2)
      • Node.js (2)
    • Computer Science (8)
      • Computer Networks (3)
      • Operating Systems (4)
      • OOP (1)
    • 독서 (4)
      • 데이터 중심 애플리케이션 설계 (3)
      • 객체지향의 사실과 오해 (1)
    • 회고 (4)
      • Project (2)
      • Career (2)
    • Deprecated (280)

채널

  • GitHub
  • LinkedIn

최근 글

태그

  • Database
  • back-end
  • front-end
  • 개발자
  • programmers
  • 코딩
  • 프로그래머스
  • 백준C++
  • 백준Go
  • 알고스팟
  • Baekjoon Online Judge
  • 프로그래머스C++
  • 백준
  • 백엔드
  • 데이터베이스
  • 프로그래머스Python
  • 프로그래밍
  • 알고스팟Python
  • 백준Python
  • Algospot

최근 댓글

인기 글

hELLO
HelloMinchan
Deprecated

[Baekjoon Online Judge] 백준 9663번 N-Queen(Python)

[Baekjoon Online Judge] 백준 9663번 N-Queen(Python)
Deprecated

[Baekjoon Online Judge] 백준 9663번 N-Queen(Python)

2020. 4. 4. 03:50

© 2020 All Rights Reserved. 주식회사 스타트링크

[Baekjoon Online Judge] 백준 9663번 N-Queen

(Python)

(글쓴날 : 2020.04.04)

 


* Baekjoon Online Judge, 백준 9663번 문제 Python 언어 풀이입니다.

* 소스 코드의 저작권은 글쓴이에게 있습니다.


 

 

백준 9663번 N-Queen


1) 문제

문제 링크 : https://www.acmicpc.net/problem/9663

 

9663번: N-Queen

N-Queen 문제는 크기가 N × N인 체스판 위에 퀸 N개를 서로 공격할 수 없게 놓는 문제이다. N이 주어졌을 때, 퀸을 놓는 방법의 수를 구하는 프로그램을 작성하시오.

www.acmicpc.net


2) 풀이 과정

N X N 크기의 체스판에 서로 겹치지 않게 N개의 퀸을 놓을 수 있는 경우의 수를 출력하는 문제이며,

N-Queen 문제라고 불리는, 백트래킹 알고리즘의 가장 대표적인 문제입니다.

 

저의 경우, 정말 아쉽게도 시간 복잡도를 낮추는 방법을 제 스스로 도저히 구현하지 못하겠기에, 다른 분의 방식을 참고하여 문제를 해결했습니다.

 

처음에 제가 생각했던 로직은 DFS를 기본으로 퀸을 체스판에 놓기 전 겹치는 퀸이 있는지 상하좌우, 대각선 전부 체크해가며 해결하는 방식이었고, 이 체크 방법으로 푼 결과 시간 초과가 나왔습니다.

 

이를 해결할 수 있는 방법은 다음과 같습니다.

어차피 "N"개의 퀸이 N X N 크기의 체스판에 놓여야 하므로, 퀸들이 각 행마다 반드시 1개씩 존재해야 하고 따라서 행, 즉, 좌우는 확인할 필요가 없었습니다.

그렇다면, 확인해야 할 남은 방향은 열기준인 상, 하와 대각선인데 열의 경우 길이가 N인 1차원 배열을 만들어 체크를 해주면 되고,

대각선의 경우, 퀸을 기준으로 ↗, ↙ 이 두 가지 방향은 현재 인덱스의 합이 해당 대각선 방향 각각의 인덱스의 합들과 같다는 규칙이 있었습니다.

(체스판에 직접 인덱스를 매겨서 더해보시면 이해가 쉽습니다. ex) (0,2) = (1,1) = (2,0) )

따라서 2차원 배열을 탐색해가며 겹치는 퀸을 체크하는 것이 아닌 길이가 N * 2 -1인 1차원 배열로 체크가 가능해집니다.

나머지 ↖, ↘ 이 두 방향의 경우도 똑같은 원리로 인덱스 제어 변수가 i, j라고 쳤을 때 i-j+N-1이라는 규칙이 성립합니다.

 

이 방법을 적용해 푼 결과 훨씬 더 효율적인 탐색이 가능했고, 결국 문제를 해결했습니다.

다만, Python 3의 경우 이 방식을 적용해도 시간 초과가 발생하며, PyPy3로 제출해야 정답 처리가 됩니다.

아무래도, 백트래킹 알고리즘 분야는 Python으로 풀지 않는 것이 최선일 듯합니다.

 

* 참고 블로그 : https://rebas.kr/761


3) 코드

 

* Python 코드(PyPy3)

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
import sys
input = sys.stdin.readline
 
 
def DFS(i):
    global N, col, slash, backSlash, case
    if i == N:
        case += 1
        return
    for j in range(N):
        if not (col[j] or slash[i + j] or backSlash[i - j + N - 1]):
            col[j] = slash[i + j] = backSlash[i - j + N - 1] = True
            DFS(i + 1)
            col[j] = slash[i + j] = backSlash[i - j + N - 1] = False
 
 
N = int(input())
col, slash, backSlash = [False] * N, [False] * (2 * N - 1), [False] * (2 * N - 1)
case = 0
 
DFS(0)
 
print(case)

 

저작자표시 비영리 변경금지 (새창열림)

'Deprecated' 카테고리의 다른 글

[Baekjoon Online Judge] 백준 1654번 랜선 자르기(Python)  (0) 2020.04.06
[Baekjoon Online Judge] 백준 2805번 나무 자르기(Python)  (0) 2020.04.04
[Baekjoon Online Judge] 백준 14888번 연산자 끼워넣기(Python)  (5) 2020.04.03
[Baekjoon Online Judge] 백준 15652번 N과 M (4)(Python)  (0) 2020.04.02
[Baekjoon Online Judge] 백준 15651번 N과 M (3)(Python)  (0) 2020.04.02
  • [Baekjoon Online Judge] 백준 9663번 N-Queen
  • (Python)
  • 백준 9663번 N-Queen
'Deprecated' 카테고리의 다른 글
  • [Baekjoon Online Judge] 백준 1654번 랜선 자르기(Python)
  • [Baekjoon Online Judge] 백준 2805번 나무 자르기(Python)
  • [Baekjoon Online Judge] 백준 14888번 연산자 끼워넣기(Python)
  • [Baekjoon Online Judge] 백준 15652번 N과 M (4)(Python)
HelloMinchan
HelloMinchan
Though you should not fear failure, You should do your very best to avoid it.

티스토리툴바

단축키

내 블로그

내 블로그 - 관리자 홈 전환
Q
Q
새 글 쓰기
W
W

블로그 게시글

글 수정 (권한 있는 경우)
E
E
댓글 영역으로 이동
C
C

모든 영역

이 페이지의 URL 복사
S
S
맨 위로 이동
T
T
티스토리 홈 이동
H
H
단축키 안내
Shift + /
⇧ + /

* 단축키는 한글/영문 대소문자로 이용 가능하며, 티스토리 기본 도메인에서만 동작합니다.