https://school.programmers.co.kr/learn/courses/30/lessons/1844
프로그래머스
SW개발자를 위한 평가, 교육, 채용까지 Total Solution을 제공하는 개발자 성장을 위한 베이스캠프
programmers.co.kr
제한사항
- maps는 n x m 크기의 게임 맵의 상태가 들어있는 2차원 배열로, n과 m은 각각 1 이상 100 이하의 자연수입니다.
- n과 m은 서로 같을 수도, 다를 수도 있지만, n과 m이 모두 1인 경우는 입력으로 주어지지 않습니다.
- maps는 0과 1로만 이루어져 있으며, 0은 벽이 있는 자리, 1은 벽이 없는 자리를 나타냅니다.
- 처음에 캐릭터는 게임 맵의 좌측 상단인 (1, 1) 위치에 있으며, 상대방 진영은 게임 맵의 우측 하단인 (n, m) 위치에 있습니다.
내가 생각한 풀이
벽은 0, 길은 1
한 칸씩 갈때마다 +1 하기
DFS로 탐색하고 최소값 return하기
(n-1,m) 과 (n, m-1)이 모두 0이면 -1 return
최단거리 유형 문제 -> BFS -> 큐 -> collections deque 이용하기
BFS 풀이
BFS 과정
1. 시작노드 큐에 넣고 방문처리하기
2. 큐에서 노드 꺼내고(popleft()) 인접노드 중 방문하지 않은 노드를 큐에 넣고 방문 처리하기
3. 큐에 노드 없을 때까지 2번 과정 반복
이코테 미로탈출 문제 참고하기
from collections import deque # BFS 구현에 필요한 deque를 import
def solution(maps):
# 맵의 행과 열 크기 설정
m = len(maps) # 맵의 행 개수
n = len(maps[0]) # 맵의 열 개수
# 시작점이나 도착점이 막혀 있다면 경로가 없으므로 -1 반환
if maps[0][0] == 0 or maps[m-1][n-1] == 0:
return -1
# BFS 탐색을 위한 큐 초기화: 시작점 (0, 0) 추가
queue = deque([(0, 0)])
# 이동할 네 가지 방향: 상, 하, 우, 좌
directions = [(-1, 0), (1, 0), (0, 1), (0, -1)]
# BFS 탐색 시작
while queue:
x, y = queue.popleft() # 큐에서 현재 위치를 꺼냄
# 현재 위치에서 상하좌우로 이동 시도
for dx, dy in directions:
nx, ny = x + dx, y + dy # 이동 후 새로운 좌표 계산
# 이동할 좌표가 유효한지 확인 (맵의 범위 안에 있는지)
if 0 <= nx < m and 0 <= ny < n and maps[nx][ny] == 1:
# 이동 가능한 칸이라면 거리 업데이트
maps[nx][ny] = maps[x][y] + 1
queue.append((nx, ny)) # 큐에 새로운 좌표 추가
# 도착점의 값이 변경되었는지 확인 (최단 경로를 찾았는지)
return maps[m-1][n-1] if maps[m-1][n-1] > 1 else -1
https://jyeonnyang2.tistory.com/243
[프로그래머스] 게임 맵 최단거리 - 파이썬(python)
문제 설명 ROR 게임은 두 팀으로 나누어서 진행하며, 상대 팀 진영을 먼저 파괴하면 이기는 게임입니다. 따라서, 각 팀은 상대 팀 진영에 최대한 빨리 도착하는 것이 유리합니다. 지금부터 당신은
jyeonnyang2.tistory.com
'Algorithm > DFS&BFS' 카테고리의 다른 글
[프로그래머스] 타겟 넘버/DFS/파이썬 (어렵) (0) | 2024.12.17 |
---|---|
[이코테] DFS/BFS/ 특정 거리의 도시 찾기 (0) | 2024.10.30 |
[이코테]DFS/BFS/ 음료수 얼려먹기 (1) | 2024.10.22 |
9466번/DFS 텀 프로젝트/파이썬 (0) | 2024.09.29 |
1240번/DFS 노드사이거리/파이썬 (1) | 2024.09.28 |