TIL/Algorithm
[99클럽 코테 스터디 12일차 TIL] 프로그래머스 | 게임 맵 최단거리
ujum
2024. 5. 31. 18:31
728x90
Problem
프로그래머스
코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.
programmers.co.kr
Sol
미로 속에서 상대에게 가는 가장 짧은 경로를 찾으면 되는 문제
✔ 최단경로 찾기 - BFS(Breadth First Search, 너비우선) 알고리즘 사용
오랜만에 문제를 풀어봤는데 어디서 많이 본 미로가 나왔습니다!
알고리즘 수업때 배운 것이었는데요. 외쳐 갓오흠.! 약 2년전에 들은 수업이지만 알기 쉽게 설명해주셔서 기억에 오래 남은 것 같아요. Recursion을 사용하는 DFS 계열의 문제에 대한 영상이지만 알고리즘 공부에 참고하시면 좋을 것 같습니다 👍
🌱 참고
https://www.youtube.com/watch?v=m6lXDsx7oCk&list=PL52K_8WQO5oUuH06MLOrah4h05TZ4n38l&index=4
DFS vs. BFS
DFS(Depth-First Search) | BFS(Breadth-First Search) |
가능한 한 깊이 내려가면서 탐색 | 인접 노드들을 탐색 한 후 그 다음 깊이의 노드 탐색 |
Recursion, Stack 사용하여 경로 추적 | Queue 사용하여 관리 |
모든 경로 탐색에 적합, 최단 경로 보장 X | 최단 경로 문제에 적합 |
O(V+E) | O(V+E) |
✔ Answer
Python의 collections 모듈에서 제공하는 deque(double-ended queue)를 사용하여 문제를 해결했습니다.
from collections import deque
def solution(maps):
N = len(maps)
M = len(maps[0])
# 상, 하, 좌, 우 방향
directions = [(-1,0), (1,0), (0,-1), (0,1)]
# BFS 큐 초기화 시작점(0,0) 거리 1
queue = deque([(0,0,1)])
# 방문한 곳 marking
visited = set((0,0))
# queue 빌 때까지
while queue:
# 현재 위치, 거리 꺼냄
x, y, dist = queue.popleft()
# 목표지점 (N-1, M-1) 도착!
if x == N -1 and y == M -1:
return dist
# 상하좌우로 이동
for dx, dy in directions:
# 새로운 위치
nx, ny = x + dx, y + dy
# 맵 범위 내 && no 벽 && not visited
if 0 <= nx < N and 0 <= ny < M and maps[nx][ny] == 1 and (nx, ny) not in visited:
# 새 위치, 거리 추가
queue.append((nx, ny, dist+1))
# 방문 marking
visited.add((nx, ny))
return -1
💬 다시 기초부터 하자는 마인드로 비기너 반에 신청했었는데, 조금 더 공부하고 생각하면서 문제를 풀고 싶어서 미들러 반으로 변경을 부탁드렸어요 🔥 다른 사람들의 풀이를 보면서 더 깊게 생각해본 시간이었습니다.