문제
프로그래머스
코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.
programmers.co.kr
문제 풀이
- 레버까지 도달하는 데 걸리는 시간 + 레버부터 목적지까지 도달하는 데 걸리는 시간을 해야 하므로 bfs를 두 번 돌려야한다.
- bfs를 돌릴 때 시작지점과 도착지점이 모두 다르므로 인자로 넘겨서 큐에 넣고 탐색
- 이후 한 개라도 도달 할 수 없는 경우가 있다면 -1, 목적지까지 도달 할 수 있다면 시간 반환
코드
from collections import deque
# 상하좌우
dy = [-1,1,0,0]
dx = [0,0,-1,1]
def solution(maps):
# start 부터 end까지의 거리 측정
def bfs(start, end):
start_flag = False
n = len(maps)
m = len(maps[0])
visited = [[0] * m for _ in range (n)]
queue = deque()
# 시작 지점 찾기
for i in range(n):
for j in range(m):
# 시작지점 찾은 후 종료
if maps[i][j] == start:
start_flag = True
queue.append((i,j, 0))
visited[i][j] = 1
break
# 시작지점 찾은 후 바깥 루프도 종료
if start_flag:
break
# 도착지점 까지의 거리 체크
while queue:
y, x, cost = queue.popleft()
if maps[y][x] == end:
return cost
for i in range(4):
ny = y + dy[i]
nx = x + dx[i]
# 범위 내에 있는지 체크
if 0 <= ny < n and 0 <= nx < m and not visited[ny][nx] and maps[ny][nx] != 'X':
visited[ny][nx] = 1
queue.append((ny, nx, cost + 1))
return False
lever = bfs('S','L')
arrive = bfs('L','E')
if lever and arrive:
answer = lever + arrive
else:
answer = -1
return answer'Algorithm > BFS&DFS' 카테고리의 다른 글
| [Python] 백준 11567번 선진이의 겨울왕국 (5) | 2024.08.28 |
|---|---|
| [Python] 백준 2146번 다리 만들기 (3) | 2024.08.27 |
| [Java] 백준 13165번 침투 (2) | 2023.11.02 |
| [Python] 백준 1240번 노드사이의 거리 (1) | 2023.11.01 |
| [Java] 백준 4179번 불! (1) | 2023.11.01 |