문제
프로그래머스
코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.
programmers.co.kr
코드
from collections import deque
def solution(board):
answer = 0
board = [list(_) for _ in board]
row, col = len(board), len(board[0])
res = [[0 for i in range(len(board[0]))] for j in range(len(board))]
d = [(0, 1), (1, 0), (-1, 0), (0, -1)]
q = deque()
def slide(i,j,dr,dc):
while True:
ci,cj = i + dr, j + dc
if not (0 <= ci < row and 0 <= cj < col) or board[ci][cj] == 'D':
return ci-dr, cj-dc
i,j=ci,cj
for i in range(row):
for j in range(col):
if board[i][j]== 'R':
q.append((i,j,0))
while q:
cx, cy, dist = q.popleft()
res[cx][cy]=dist
if(board[cx][cy]=='G'):
answer=dist
break
for dr , dc in d:
nx,ny=slide(cx,cy,dr,dc)
if(res[nx][ny]==0):
res[nx][ny]=1
q.append((nx,ny,dist+1))
if(answer==0):
return -1
else:
return answer
풀이
- 리코쳇 로봇 최소 경로 찾기
- 문자열을 리스트화 시켜준다.
- 시작지점 R 부터 목적지 G 지점까지 도달하는 경로를 찾는다.
- BFS를 사용한다.
- 한칸씩 이동시키는 것이 아닌 slide 함수를 사용해서 진행방향에 벽 혹은 끝까지 진행하는 좌표를 얻는다.
- 해당 좌표를 지나간적이 없으면 q에 추가해준다.
- 만약 현재 좌표가 ‘G’면 answer에 거리를 추가한다
- 모든 탐색이 끝난 후 answer이 0인 경우에는 경로를 못찾은것이기 때문에 -1을 아니면 answer을 출력한다.
'알고리즘' 카테고리의 다른 글
[백준] 17485 진우의 달 여행 (Large) python (1) | 2024.02.27 |
---|---|
[백준] 17484 진우의 달 여행 (Small) python (1) | 2024.02.27 |
[프로그래머스] 미로 탈출 python (1) | 2024.02.13 |
[프로그래머스] 짝지어 제거하기 python (0) | 2024.02.09 |
[백준] 20920 영단어 암기는 괴로워 python (1) | 2024.02.05 |