Skip to content

Commit f81ef13

Browse files
committed
1 parent 9ca44c9 commit f81ef13

File tree

1 file changed

+59
-0
lines changed

1 file changed

+59
-0
lines changed

Hongjoo/lv2/리코쳇로봇.py

Lines changed: 59 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,59 @@
1+
"""
2+
#문제 다 읽고 수도 코드 짜자
3+
- goal) 시작 R => 목표 G 까지 최소 이동 수 구하기(도달 못하면 -1 )
4+
- 상하좌우로 "장애물, 가장자리"에 부딫칠 떄까지 이동 = 1회 이동 => 외곽& 장애물 = field[-1]
5+
- board 는 text로 주어짐 => 2차원 배열로 변환
6+
# flow - BFS : 최단 거리
7+
- 이동 방법
8+
"""
9+
from collections import deque
10+
INF = 1e9
11+
def solution(board):
12+
answer = 0
13+
#1. 필드 board 정보를 2차원 배열로 변환(장애물 -1/ 없음 0 )
14+
N , M = len(board) , len(board[0])
15+
field = [[INF]*M for _ in range(N)]
16+
17+
for i in range(N) :
18+
for j in range(M) :
19+
if board[i][j] == "R":
20+
start = [i,j]
21+
elif board[i][j] == "G":
22+
target = [i,j]
23+
elif board[i][j] == "D":
24+
field[i][j] = -1
25+
# print("break",field[i][j])
26+
#2. 탐색
27+
# print(start , target ,field)
28+
#상하좌우
29+
dy = [-1, 1, 0,0]
30+
dx = [0,0,-1,1]
31+
def move_node(d, start): # 이동 방향 ,출발점
32+
ny , nx = start ; flag = False # flag : 최소 이동 여부(Y/N)
33+
while 0<= ny + dy[d]< N and 0<= nx+dx[d] < M and field[ny + dy[d]][nx+dx[d]] >= 0 : # 장애물, 가장자리x
34+
ny += dy[d] ; nx += dx[d]
35+
flag = True
36+
return ny ,nx , flag
37+
# 시작점 초기화
38+
q= deque([start])
39+
field[start[0]][start[1]] = 0
40+
cnt = 0
41+
while q :
42+
cy,cx = q.popleft()
43+
if [cy,cx] == target : #(옵션)효율성
44+
break
45+
for di in range(4):
46+
cnt += 1
47+
ny,nx,f = move_node(di, [cy,cx])
48+
if f and field[ny][nx] == INF : # 해당 [ny,nx] 에 처음 도착(방문x) & 해당 지점에 이동 가능할 경우
49+
field[ny][nx] = min(field[ny][nx], field[cy][cx]+1)
50+
# min은 필요 없음(BFS로 가장먼저 field에 입력 된 턴수가 최소 이동수 )
51+
# field안에 최소 이동 턴수 기록
52+
q.append([ny,nx])
53+
54+
#3. 출력
55+
answer=field[target[0]][target[1]]
56+
# target지점 값에 업데이트가 없음 -> 도달 못함 : -1 / 최소 이동 턴수
57+
if answer >= INF :
58+
answer = -1
59+
return answer

0 commit comments

Comments
 (0)