Algorithm/BFS

[HackerRank] KnightL on a Chessboard

킹우현 2023. 5. 12. 20:45

def findMinimum(a,b,n):
    area = [[0]*n for _ in range(n)]
    visited = [[False]*n for _ in range(n)]
    nx = [a, a, -a, -a, b, b, -b, -b]
    ny = [b, -b, b, -b, a, -a, a, -a]
    queue =[[0,0]]
    
    visited[0][0] = True
    
    while queue:
        v = queue.pop(0)
        for i in range(8):
            temp_x = v[0] + nx[i]
            temp_y = v[1] + ny[i]
            
            if temp_x >= 0 and temp_x < n and temp_y >=0 and temp_y < n:
             if not visited[temp_x][temp_y]:
                if area[temp_x][temp_y] == 0:
                    area[temp_x][temp_y] = area[v[0]][v[1]] + 1
                else:
                    area[temp_x][temp_y] = min(area[temp_x][temp_y], area[v[0]][v[1]] + 1)
                queue.append([temp_x,temp_y])
                visited[temp_x][temp_y] = True
                
    if area[n-1][n-1] == 0:
        return -1
    else:
        return area[n-1][n-1]

def knightlOnAChessboard(n):
    # Write your code here
    result = [[0]*(n-1) for _ in range(n-1)]
    for i in range(1,n):
        for j in range(1,n):
            result[i-1][j-1]=findMinimum(i,j,n)
    return result

이번 문제는 주어진 n x n 크기의 체스판에서 장기말이 이동할 수 있는 범위가 (1, 1) ~ (n-1, n-1)으로 주어졌을 때, (n-1, n-1) 위치까지 이동할 수 있는 최소 이동 횟수를 구하는 문제이다. 이때 해당 자리에서 (n-1, n-1) 위치까지 이동할 수 없다면 -1 을 저장해야 한다.

 

이 문제는 해석하는데 시간이 오래 걸리긴 했지만, 결국 이동할 수 있는 범위가 주어졌을 때 (0, 0)에서 (n-1, n-1)까지 이동하는 횟수의 최솟값을 구하는 문제이다.

 

이 문제를 이해하고 나서 생각난 해결법은 DFS나 BFS 알고리즘을 사용하여 (n-1, n-1)까지 도착하는 경우의 수를 구하는 것이었는데, 최소 이동 횟수를 유지해야 하는 이유 때문에 BFS를 사용하였다.

 

또한, 주어진 범위로 이동할 수 있는 경우의 수는 nx = [a, a, -a, -a, b, b, -b, -b] ny = [b, -b, b, -b, a, -a, a, -a] 로 총 8가지 이기 때문에 8가지 이동 경로를 모두 이동해가며 아직 이동하지 않았다면 현재까지의 이동 횟수 + 1을 저장하였고, 이동한 적이 있었다면 현재까지의 이동 횟수 + 1 와 저장된 이동 횟수의 최솟값을 저장해주었다.

 

for i in range(1,n):
        for j in range(1,n):
            result[i-1][j-1]=findMinimum(i,j,n)

그리고 마지막으로 이동할 수 있는 범위는 1 <=  a, b < n 이므로 (1, 1)부터 (n-1, n-1)까지 Burte Force, 즉 모든 범위를 완전 탐색을 해보아야 한다는 의미이고, 따라서 2중 반복문을 통해 모든 범위를 체크해주었다.

 

처음에 deque 라이브러리를 사용하였더니 오류가 발생하여 구글링을 통해 deque를 사용하지 않고 큐 자료구조를 사용할 수 있는 방법을 사용하였다. (queue = [[0,0]], v = queue.pop(0)) ⭐️

'Algorithm > BFS' 카테고리의 다른 글

[백준 16236번] 아기 상어  (0) 2023.05.27
[HackerRank] Connected Cells in a Grid  (0) 2023.05.12
[백준 2583번] 영역 구하기  (0) 2023.04.06
[백준 2468번] 안전 영역  (0) 2023.02.15
[백준 2644번] 촌 수 계산  (0) 2023.02.15