Skip to content

Commit 630a406

Browse files
committed
1 parent 5f53bb9 commit 630a406

File tree

1 file changed

+55
-0
lines changed

1 file changed

+55
-0
lines changed

Hongjoo/lv3/블록이동하기.py

Lines changed: 55 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,55 @@
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 visied : #없으면
54+
queue.append((pset , dis+1))
55+
visited.add(pset)

0 commit comments

Comments
 (0)