Algorithm/HackerRank

Red Knight's Shortest Path

Red_Horse 2025. 9. 19. 00:42

출처 : 해커 랭크

난이도 : 중간

알고리즘 : BFS

 

일반 체스에서는 말이 검은색과 흰색, 두 가지 색으로만 구성됩니다. 하지만 저희 체스 버전에서는 독특한 움직임을 가진 새로운 말을 추가했습니다. 이 버전에서 가장 강력한 말 중 하나는 빨간색 나이트 입니다 .

아래 그림에서 볼 수 있듯이 붉은색 기사는 현재 위치를 기준으로 여섯 가지 다른 위치(상단 왼쪽, 상단 오른쪽, 오른쪽, 하단 오른쪽, 하단 왼쪽, 왼쪽)로 이동할 수 있습니다.

보드는 크기의 격자입니다 n x n 각 셀은 좌표 쌍으로 식별됩니다. (i,j), 어디 i행 번호이고 j는 열 번호이며 둘 다 0부터 인덱스됩니다. 따라서 (0, 0),왼쪽 상단 모서리입니다. (n - 1, n - 1)오른쪽 하단 모서리입니다.

printShortestPath그리드 크기를 입력으로 받는 함수를 완성하세요 .n, 그리고 시작 및 종료 위치의 좌표(i_start, j_start) 그리고 (i_end, j_end)각각을 입력으로 사용합니다. 이 함수는 아무것도 반환하지 않습니다.

빨간색 기사의 시작 위치 좌표와 목적지 좌표가 주어졌을 때, 빨간색 기사가 목적지에 도달하기 위해 이동해야 하는 최소 횟수를 출력하고, 그 후 목적지에 가장 짧은 시간 안에 도달하기 위해 따라야 하는 이동 순서를 출력하세요. 목적지에 도달할 수 없는 경우, "Impossible"이라는 단어만 출력하세요.

참고: 목적지까지 이어지는 최단 경로는 여러 개일 수 있습니다. 따라서 빨간색 기사가 가능한 이웃 위치를 다음과 같은 우선순위 순서로 고려한다고 가정합니다: UL, UR, R, LR, LL, L. 다시 말해, 가능한 옵션이 여러 개 있는 경우, 빨간색 기사는 최단 경로를 찾을 수 있는 한 이 목록에서 첫 번째 이동을 우선시합니다. 샘플 입력 확인2 예를 들어.

입력 형식

첫 번째 입력 줄에는 단일 정수가 포함됩니다.n두 번째 줄에는 공백으로 구분된 네 개의 정수가 포함됩니다. i_start, j_start, i_end, j_end. (i_start, j_start)시작 위치의 좌표를 나타냅니다. (i_end, j_end) 최종 위치의 좌표를 나타냅니다.

제약 조건

  • 5 ≤ n ≤200
  • 0 ≤ i_start, j_start, i_end, j_end < n
  • 시작 위치와 종료 위치가 다릅니다

출력 형식

목적지에 도달할 수 있으면 두 줄을 출력합니다. 첫째 줄에는 빨간 기사가 목적지에 도달하기 위해 이동해야 하는 최소 횟수를 나타내는 정수 하나를 출력합니다. 둘째 줄에는 공백으로 구분하여 이동 순서를 출력합니다.

목적지에 도달할 수 없는 경우, 단어만 포함된 한 줄을 출력합니다 Impossible.

샘플 입력 0

7 
6 6 0 1

샘플 출력 0

4 
울 울 울 엘

설명 0

샘플 입력 1

6 
5 1 0 5

샘플 출력 1

불가능한

설명 1

샘플 입력 2

7 
0 3 4 3

샘플 출력 2

2 
LR LL

설명 2

 

----------------------------------------------------------------------------------------------------------------------------

 

문제 해독


체스게임에서 말의 이동 가능 방향이 주어졌을때 시작위치에서 목적지 까지 가는 최단 경로를 구하는 문제

 

문제접근

 

말이 움직일 수 있는 위치를 x,y로 구성하고 구성한 이동방향과 동일한 인덱스의 이동 경로 배열을 만들어 이동 할때마다 경로를 추가하여 목적지에 도달하였을때 해당 경로를 출력. 단 경로 도달 실패시 이동 불가 문구 출력

 

public static void printShortestPath(int n, int i_start, int j_start, int i_end, int j_end)
    {
    // Print the distance along with the sequence of moves.
        int[] dy = new int[] {-1, 1, 2, 1, -1, -2};
        int[] dx = new int[] {-2, -2, 0, 2, 2, 0};
        string[] droad = new string[] {"UL", "UR", "R", "LR", "LL", "L"};
        
        bool[,] visited = new bool[n,n]; 
        Queue<(int x, int y, List<string> step)> q = new Queue<(int x, int y, List<string> step)>();
        q.Enqueue((i_start, j_start, new List<string>()));
        visited[i_start, j_start] = true;
        
        while(q.Count() > 0)
        {
            var (x, y, step) = q.Dequeue();
            
            if(x == i_end && y == j_end)
            {
                Console.WriteLine($"{step.Count()}");
                foreach(string s in step)
                {
                    Console.Write($"{s} ");
                }
                return;
            }
            for(int i = 0; i < 6; i++)
            {
                int nx = x + dx[i];
                int ny = y + dy[i];
                if(nx < 0 || nx >= n || ny < 0 || ny >= n)
                    continue;
                if(visited[nx,ny])
                    continue;
                
                visited[nx,ny] = true;

                List<string> newStep = new List<string>(step);
                newStep.Add(droad[i]);
                q.Enqueue((nx, ny, newStep));
            }
        }
        
        Console.Write("Impossible");
    }

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

Recursive Digit Sum  (0) 2025.09.19
Connected Cells in a Grid  (0) 2025.09.19
The Coin Change Problem  (0) 2025.09.18
Marc's Cakewalk  (0) 2025.09.18
Candies  (0) 2025.09.18