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