데이터 엔지니어
프로그래머스 - [LEVEL 4] 게임 맵 최단거리 본문
문제링크: https://programmers.co.kr/learn/courses/30/lessons/1844
문제 설명
- 맵이 주어졌을 때 최단 경로로 도착지점까지 갈 수 있는 비용 구하기
- 벽(0) 길(1) 로 주어짐
- 못가는 경우 -1 리턴
- ex)
풀이
- BFS
- queue에 (x, y, cost) 형식으로 들어감
- 방문관리를 cost와 함께 진행해 주어야 함 ex) (0, 2): 5 => 0, 2지점의 cost는 5이다.
- 방문을 하지 않았거나 방문한 곳의 cost가 현재 지점의 코스트보다 작을경우만 queue에 추가한다.
핵심은 이정도이고 나머지는 코드를 보면서 이해하시면 될 것 같습니다.
from collections import deque
direction = ((-1, 0), (1, 0), (0, -1), (0, 1)) # ^ > v < 순
def solution(maps):
# (x, y): cost 형식으로 방문관리
visited = {(0, 0): 0}
# 정답 초기 변수
answer = float('inf')
# (x, y, cost) 형식으로 큐에 들어감
queue = deque()
queue.append([0, 0, 1])
# 맵의 끝 변수
x_lim = len(maps)
y_lim = len(maps[0])
while queue:
x, y, cost = queue.popleft()
# 4가지 방향 탐색
for d in direction:
nx = x + d[0]
ny = y + d[1]
# 맵안에 있고 벽이 아닌 경우
if 0 <= nx < x_lim and 0 <= ny < y_lim and maps[nx][ny]:
new_cost = cost + 1
# 목적지에 도달하였을 경우
if nx == lim_x - 1 and ny == lim_y - 1:
answer = min(answer, new_cost)
# 방문을 하지 않았거나 / 방문한 곳의 new_cost가 기존보다 작을 경우
elif visited.get((nx, ny)) == None or visited.get((nx, ny)) > new_cost:
# 방문 체크 해주고 다음 queue에 추가
visited[(nx, ny)] = new_cost
queue.append([nx, ny, new_cost])
# 도착 못했을 경우
if answer == float('inf'): answer = -1
return answer
참고로 저는 카카오 인턴 코테에서 비슷한 문제를 푼적이 있어서 그걸 활용했습니다.
'프로그래밍(Programming) > 알고리즘(Algorithm)' 카테고리의 다른 글
백준 - [Gold 5] 14500번 테트로미노 (0) | 2020.08.30 |
---|---|
백준 - [Silver 1] 2294번 동전 2 (0) | 2020.08.29 |
프로그래머스 - [LEVEL 3] 가장 긴 팰린드롬 (0) | 2020.08.28 |
백준 - [Gold 3] 1644번 소수의 연속합 (0) | 2020.08.27 |
백준 - [Silver 3] 1654번 랜선 자르기 (0) | 2020.08.26 |
Comments