Problem Solving/BOJ

[BOJ][Python]백준 9663번 풀이

NoiB 2021. 12. 19. 18:25
반응형

그냥 듀크입니다. 이번 문제는 진짜 오래걸렸는데요. 머리로는 알겠는데 재귀로 구현을 하려니 자꾸 뭐가 안되고 해서 시간이 많이 걸렸습니다. 제가 재귀 연습을 좀 해야겠다 하고 생각하게 해준 문제기도 하구요.

 

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

 

9663번: N-Queen

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

www.acmicpc.net

코드 : 

import sys
ssr = sys.stdin.readline

def put_queen(cdx):
    if cdx == n:
        global cnt
        cnt += 1
    else:
        for i in range(n):
            if visited[i]:
                continue
            q_list[cdx] = i
            if check(cdx):
                visited[i] = True
                put_queen(cdx+1)
                visited[i] = False
            
def check(n):
    for i in range(n):
        if q_list[n] == q_list[i] or n-i == abs(q_list[n] - q_list[i]):
            return False
    return True
                
if __name__ == '__main__':
    n = int(ssr())
    cnt = 0
    q_list = [0 for _ in range(n)]
    visited = [False for _ in range(n)]
    
    put_queen(0)
    print(cnt)

참고로 말씀을 드리자면 파이썬은 pypy3로 제출하셔야 통과 될 겁니다. 기본적인 개념은 일단 퀸을 한 번 놔보고 check 함수에서 조건에 부합하는지를 확인한 다음 문제가 없으면 진행하고 문제가 있으면 인덱스를 올려가면서 해당 사이클을 반복하는 형식입니다. 미리 queen을 배치할 보드를 만들어놔야 인덱스에러가 뜨지 않습니다.

 

그냥 듀크였습니다.

반응형