1+ # 결국 그냥 미로찾기 문제에서 기본 비용은 100원 처리, 코너가 발생할때마다 500원 추가로 처리하면됀다
2+ from collections import deque
3+
4+ board = [[0 , 0 , 1 , 0 , 1 , 1 , 0 , 0 , 0 , 0 ], [0 , 0 , 0 , 0 , 1 , 0 , 1 , 1 , 0 , 1 ], [1 , 0 , 0 , 0 , 0 , 1 , 1 , 0 , 1 , 0 ], [0 , 0 , 0 , 0 , 0 , 0 , 1 , 0 , 0 , 0 ], [0 , 0 , 0 , 0 , 1 , 0 , 1 , 0 , 1 , 1 ], [0 , 0 , 1 , 0 , 1 , 1 , 0 , 1 , 0 , 1 ], [0 , 1 , 0 , 0 , 1 , 0 , 0 , 0 , 1 , 0 ], [1 , 0 , 0 , 1 , 0 , 0 , 0 , 0 , 0 , 0 ], [0 , 0 , 0 , 0 , 0 , 1 , 0 , 1 , 0 , 0 ], [1 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 1 , 0 ]]
5+
6+ q = deque ()
7+ dx , dy = [- 1 , 1 , 0 , 0 ], [0 , 0 , - 1 , 1 ] #상하좌우
8+ INF = 1000000000
9+
10+ def solution (board ):
11+ answer = 0
12+ size = len (board )
13+ dp = [[INF ] * size for _ in range (size )]
14+ visited = [[0 ] * size for _ in range (size )]
15+ visited [0 ][0 ] = 1
16+ if board [0 ][1 ] == 0 :
17+ q .append ((0 , 0 , 0 , 1 ))
18+ while q :
19+
20+ x , y , count , dir = q .popleft () #dir은 진행방향 1 = 가로, -1 = 세로
21+ # if x == size - 1 and y == size - 1:
22+ # break
23+
24+ for i in range (4 ):
25+ nx = x + dx [i ]
26+ ny = y + dy [i ]
27+ if 0 <= nx < size and 0 <= ny < size and board [nx ][ny ] == 0 :
28+ if dp [nx ][ny ] > count + 6 :
29+
30+ if dir == 1 and i % 4 < 2 : # 진행방향이 가로고, 다음 움직일 곳이 세로면
31+ dp [nx ][ny ] = min (dp [nx ][ny ], count + 6 )
32+ q .append ((nx , ny , count + 6 , - 1 ))
33+ elif dir == - 1 and i % 4 > 1 : # 진행방향이 세로고, 다음 움직일 곳이 가로면
34+ dp [nx ][ny ] = min (dp [nx ][ny ], count + 6 )
35+ q .append ((nx , ny , count + 6 , 1 ))
36+
37+ if dp [nx ][ny ] > count + 1 :
38+ if dir == 1 and i % 4 > 1 : # 진행방향이 가로고, 다음 움직일 곳도 가로면
39+ dp [nx ][ny ] = min (dp [nx ][ny ], count + 1 )
40+ q .append ((nx , ny , count + 1 , 1 ))
41+ elif dir == - 1 and i % 4 < 2 : # 진행방향이 세로고, 다음 움직일 곳이 세로면
42+ dp [nx ][ny ] = min (dp [nx ][ny ], count + 1 )
43+ q .append ((nx , ny , count + 1 , - 1 ))
44+
45+
46+ answer = dp [size - 1 ][size - 1 ] * 100
47+
48+ if board [1 ][0 ] == 0 :
49+ q .append ((0 , 0 , 0 , - 1 ))
50+ visited = [[INF ] * size for _ in range (size )]
51+ visited [0 ][0 ] = 1
52+ dp = [[INF ] * size for _ in range (size )]
53+ while q :
54+
55+ x , y , count , dir = q .popleft () # dir은 진행방향 1 = 가로, -1 = 세로
56+ # if x == size - 1 and y == size - 1:
57+ # break
58+
59+ for i in range (4 ):
60+ nx = x + dx [i ]
61+ ny = y + dy [i ]
62+ if 0 <= nx < size and 0 <= ny < size and board [nx ][ny ] == 0 :
63+ if dp [nx ][ny ] > count + 6 :
64+
65+ if dir == 1 and i % 4 < 2 : # 진행방향이 가로고, 다음 움직일 곳이 세로면
66+ dp [nx ][ny ] = min (dp [nx ][ny ], count + 6 )
67+ q .append ((nx , ny , count + 6 , - 1 ))
68+ elif dir == - 1 and i % 4 > 1 : # 진행방향이 세로고, 다음 움직일 곳이 가로면
69+ dp [nx ][ny ] = min (dp [nx ][ny ], count + 6 )
70+ q .append ((nx , ny , count + 6 , 1 ))
71+
72+ if dp [nx ][ny ] > count + 1 :
73+ if dir == 1 and i % 4 > 1 : # 진행방향이 가로고, 다음 움직일 곳도 가로면
74+ dp [nx ][ny ] = min (dp [nx ][ny ], count + 1 )
75+ q .append ((nx , ny , count + 1 , 1 ))
76+ elif dir == - 1 and i % 4 < 2 : # 진행방향이 세로고, 다음 움직일 곳이 세로면
77+ dp [nx ][ny ] = min (dp [nx ][ny ], count + 1 )
78+ q .append ((nx , ny , count + 1 , - 1 ))
79+
80+ answer = min (answer , dp [size - 1 ][size - 1 ] * 100 )
81+
82+ return answer
83+
84+ print (solution (board ))
0 commit comments