본문 바로가기

컴퓨터/코테

릿코드 37- Sudoku Solver, nQueen 다시풀기

def dfs(board, empty, count):
    global isEnd
    if count == len(empty):
        for i in board:
            print(i)
        isEnd = True
        return
    y,x = empty[count]
    nums = possible(board, y, x)
    for num in nums:
        if not isEnd:
            board[y][x] = num
            dfs(board, empty, count+1)
            board[y][x] = 0

def possible(board, y, x):
    nums = [True for i in range(10)]
    for i in range(9):
        nums[board[y][i]] = False
        nums[board[i][x]] = False
    y = (y//3) * 3
    x = (x//3) * 3
    for i in range(y, y + 3):
        for j in range(x, x + 3):
            nums[board[i][j]] = False
    return [idx for idx, i in enumerate(nums) if i and idx != 0]

def solution(board):
    empty = [(i,j) for i in range(9) for j in range(9) if board[i][j] == '.']
    for i in range(9):
        for j in range(9):
            if board[i][j].isdigit():
                board[i][j] = int(board[i][j])
            else :
                board[i][j] = 0
    return dfs(board, empty, 0)
isEnd = False
solution([["5","3",".",".","7",".",".",".","."],["6",".",".","1","9","5",".",".","."],[".","9","8",".",".",".",".","6","."],["8",".",".",".","6",".",".",".","3"],["4",".",".","8",".","3",".",".","1"],["7",".",".",".","2",".",".",".","6"],[".","6",".",".",".",".","2","8","."],[".",".",".","4","1","9",".",".","5"],[".",".",".",".","8",".",".","7","9"]])

nQueen 문제 복습하면서 백트래킹 문제를 좀더 풀어봐야겠다 싶어 풀어본 문제. 백트래킹 문제는 dfs의 틀과 비슷한 것 같다.

1. dfs 함수 가장 처음에 종료조건 체크

2. 현재 시점에서 넣을 수 있는 값 후보들 순회하며 다음 dfs 호출

3. 다음 dfs 호출 이후에는 원상복구 해둬야함

 

위의 나만의 틀대로 nQueen 문제를 다시 풀어봤다.

def dfs(positions, row) :
    n = len(positions)
    if n == row:
        return 1
    count = 0
    possibleCol = possible(positions, row)
    for col in possibleCol :
        positions[row] = col
        count += dfs(positions, row + 1)
    return count


def possible(pos, row) :
    ret = [True for i in range(len(pos))]
    for i in range(len(pos)) :
        for j in range(row):
            if pos[j] == i or (row-j == abs(pos[j] - i)):
                ret[i] = False
    return [idx for idx, i in enumerate(ret) if i]


def solution(n):
    ans = [0] * n
    return dfs(ans, 0)

print(solution(10))

 

 

백트래킹 하나만 더해보자...

'컴퓨터 > 코테' 카테고리의 다른 글

백준 7576 - 토마토  (0) 2021.09.07
프로그래머스 여행경로 - 백트래킹  (0) 2021.09.06
nQueen - 백트래킹  (0) 2021.09.01
백준 2042 세그먼트 트리  (0) 2021.09.01
백준 17114 - 미세먼지 확산  (0) 2021.08.30