파이썬으로 부시자! Python with Coreenee

BAEKJOON 15649, 15650, 15651, 15652

15649 문제

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

입력

첫째 줄에 N이 주어진다. (1 ≤ N < 15)


나의 처음 코드

n = int(input())

row_list = [] #행
col_list = [] #열

#들어갈 수 있는 좌표인지 체크하는 함수
def check_valid(coord : tuple):
    row = coord[0]
    col = coord[1]
    tmp_row = 0
    tmp_col = 0
    #퀸이 들어가 있는 좌표의 행과 열이 같다면 들어갈 수 없다.
    if (row in row_list) or (col in col_list):
        return False
        #퀸이 들어가 있는 좌표의 대각선 좌표에 존재한다면 들어갈 수 없다.
    for i in range(len(row_list)):
        tmp_row = abs(row_list[i] - row)
        tmp_col = abs(col_list[i] - col)
        if tmp_row == tmp_col:
            return False
    return True

def n_queen(depth : int):
    global num_of_case
    #한 행에 무조건 하나의 퀸이 들어가야하므로 탈출 조건은 다음과 같다.
    if depth == n:
        num_of_case += 1
        return
    #재귀부분
    for i in range(0, n):
        if depth == 0 or check_valid((depth, i)):
            row_list.append(depth)
            col_list.append(i)
            n_queen(depth+1)
            row_list.pop()
            col_list.pop()
    return num_of_case

num_of_case = 0
print(n_queen(0))

결과는 정답입니다. 단, Pypy3 에서 돌리지 않고, Python3에서 돌리면 시간초과가 난다. 다른 사람들도 대부분 Pypy3로 돌렸다. 위의 코드 경우, 26164ms 가 나오는데 56ms가 나온 코드가 있다. 어처구니 없으니 준비하길 바란다.

print([1,0,0,2,10,4,40,92,352,724,2680,14200,73712,365596][int(input())-1])

정답을 써놓고, 정답만 추출하는 식의 코드이다. 다행히 입력하는 값들이 적어서 다행이지 많으면 안되는 코드일 것이다. 위의 코드에서 한가지 배울점은,

print([list][index]) #이렇게 쓰면 list의 index가 가지고 있는 값이 출력된다는 것이다. 한줄로 간편히 쓸 때 편하다.

백트래킹하면 무조건 나오는 문제인만큼, 한번 꼭 풀어보길 바란다.