코딩테스트/HackerRank

Red Knight's Shortest Path (Python)[HackerRank]

멍토 2020. 8. 5.

출처 : https://www.hackerrank.com/challenges/red-knights-shortest-path/problem

 

Red Knight's Shortest Path | HackerRank

Find the shortest path that the red knight will take.

www.hackerrank.com

목차

1. 문제

2. 문제 해석

3. 소스 코드


문제(축약)

이 버전에서 레드나이트라는 새로운 말이 생겼다.

레드나이트는 상좌, 상우, 우, 하좌, 하우, 우 로 움직일 수 있습니다.

그림은 아래와 같습니다.


보드의 크기는 격자판으로 n*n입니다.

격자판은 0,0 부터 n-1, n-1까지 있습니다.


격자판의 크기n과 시작지점 is, js, 와 도착지점 ie, je가 주어질때

가장 빠르게 이동이 가능한 이동횟수와 경로를 출력합니다.

도착이 불가능하다면 'Impossible'을 출력합니다.


도착하는 횟수가 같다면 상좌, 상우, 우, 하좌, 하우, 우 의 우선순위로 출력합니다.


 

조건

격자판의 크기는 5와 200 사이입니다.
n <= n <= 200

시작점과 도착점은 격자판 사이에 있습니다.
0 <= is, js, ie, je < n

시작점과 도착점의 위치는 다릅니다.

 

샘플 입력

7
6 6 0 1

 

샘플 출력

4
UL UL UL L

 


풀이

최단거리가 나왔으므로 BFS를 이용하여 풀면 되는 문제입니다.

주의해야 할점은 갔던위치를 다시가면 무한루프에 빠질 수 있으므로 갔던위치는 체크하여 더이상 이동하지 않습니다.

이동할때 우선순위를 주고나서 시작하면 처음 도착하는 순간이 가장 빠른 케이스가 됩니다.


저는 queue를 이용하여 풀건데 list를 큐처럼 이용하면 비용이 발생하므로 deque를 이용하여 풀었습니다.


소스코드

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
from collections import deque
 
dq = deque()
 
= int(input())
s_y, s_x, e_y, e_x = map(int, input().split())
 
move = [(-2-1'UL'), (-21,'UR'), (02'R'), (21'LR'), (2-1,'LL'), (0-2,'L')]
 
dq.append((s_y, s_x, []))
 
answer = []
 
check_dict = {(s_y, s_x): True}
 
while len(dq) and not answer:
    y, x, _list = dq.popleft()
    for _y, _x, command in move:
        dy, dx = y + _y, x + _x
        if 0 <= dy < n and 0 <= dx < n:
            if check_dict.get((dy, dx), False):
                continue
            check_dict[(dy, dx)] = True
            if dy == e_y and dx == e_x:
                _list.append(command)
                answer = _list
                break
            dq.append((dy, dx, _list[:]+[command]))
 
if answer:
    print(len(answer))
    print(*answer)
else:
    print('Impossible')
 

'코딩테스트 > HackerRank' 카테고리의 다른 글

Grading Students (Python)[HackerRank]  (0) 2020.08.04

댓글

💲 광고입니다.