1+ """
2+ """
3+ from collections import deque
4+ def solution (board ):
5+ N = len (board )
6+ #방향벡터 - "좌","상",하,우, (row, column) = (y,x)
7+ # 상하좌우
8+ dx = [- 1 ,0 ,1 ,0 ]
9+ dy = [0 ,1 ,0 ,- 1 ]
10+ answer = 0
11+
12+ #외벽 생성 & (idx : 1~N)
13+ nboard = [[1 ] * (N + 2 ) for _ in range (N + 2 )]
14+ for i in range (N ):
15+ for j in range (N ) :
16+ nboard [i + 1 ][j + 1 ] = board [i ][j ]
17+
18+ #위치 : (y,x, 로봇 방향, 이동횟수)
19+ # 위치값 기준 -행, 열이 더 큰값으로 변경
20+ queue = deque ([(1 ,1 ),(1 ,2 ), 0 ]) # BFS : L, R , 거리
21+ visited = set ([(1 ,1 ),(1 ,2 )]) # 방문 여부 -> L,R 둘다
22+ print ("#" ,visited ,queue )
23+ while queue :
24+ s1 ,s2 , dis = queue .popleft () # L,R,현거리
25+ # NxN목적지 도착
26+ if s1 == (N ,N ) or s2 == (N ,N ):
27+ return dis
28+ tmp = [] # 가능한 경우의 수
29+ # 상하좌우 방향으로 이동
30+ for d in range (4 ) : # [L2,R1]
31+ s1_r = s1 [0 ] + dx [d ]
32+ s1_c = s1 [1 ] + dx [d ]
33+ s2_r = s2 [0 ] + dx [d ]
34+ s2_c = s2 [1 ] + dx [d ]
35+ if nboard [s1_r ][s1_c ] == 0 and nboard [s1_r ][s1_c ] :
36+ tmp .append ( ((s1_r ,s1_c ),(s2_r ,s2_c )) ) # new position
37+ #가로 -> 세로
38+ if s1 [0 ] == s2 [0 ] : # 가로
39+ # 위로 회전 or 아래로 회전
40+ # s2 : NN과 가장 가까운 점
41+ for i in [1 ,- 1 ] :
42+ if nboard [s1 [0 ]+ i ][s1 [1 ]] == 0 and nboard [s2 [0 ]+ i ][s2 [1 ]] == 0 :
43+ tmp .append ( (s1 , (s1 [0 ] + i , s1 [1 ]) )) # s1중심
44+ tmp .append ( (s2 , (s2 [0 ] + i ,s2 [1 ]) )) # s2 중심
45+ else : # 세로 -> 가로
46+ #오른쪽 회전 , 왼쪽 회전
47+ for i in [1 ,- 1 ] :
48+ if nboard [s1 [0 ],s2 [0 ]+ i ] == 0 and nboard [s1 [0 ],s2 [0 ]+ i ] == 0 :
49+ tmp .append (((s1 [0 ],s1 [1 ]+ i ), s1 ))
50+ tmp .append (((s2 [0 ] ,s2 [1 ] + i ) ,s2 ))
51+
52+ for pset in tmp : # 이웃한 좌표들 중
53+ if pset not in visited : #없으면
54+ queue .append ((pset , dis + 1 ))
55+ visited .add (pset )
56+
57+ d
0 commit comments