π λ°±μ€ 4179 - λΆ!
π‘ λμ νμ΄
λμκ² λμ°ν λ¬Έμ μλ€.. μ΄ λ¬Έμ μ μ€μ , μ€νλ₯Ό μμ ν μμλ²λ Έλ€. π π μ μμ΄ μ½λλ₯Ό μ μΆνλ€. νμ§λ§, λμμ€λ λλ΅μ μΈλ±μ€ μλ¬
νΉμ νλ Έμ΅λλ€.
μ±μ μ€κ°μ 71%μμ μκΎΈ μ€λ΅ νμ μ λ°μλ€.
νλ¦° μ΄μ λ₯Ό λ¨κ³λ³λ‘ μμ±νλ©΄
- μΈλ±μ€ μλ¬(Index Error): λ³μ μ μ λ¨κ³μμ νκ³Ό μ΄μ λ°λλ‘ μ λ ₯νλ€.
- μλͺ»λ λ³μ μ λ ₯: λ€μ΄λ°μ λΉμ·νκ² ν΄μ κ·Έλ°μ§ μ€κ°μ λ€λ₯Έ λ³μλ₯Ό μμ±ν΄μ μ μΆνλ€.
- μλͺ»λ μ½λ: μ¬κΈ°μ μκ°μ΄ μ μΌλ§μ΄ κ±Έλ Έλλ° λ§μ§λ§ λ¨κ³μΈ
f_visited > j_visited
쑰건μ μλͺ» μΆκ°νλ€. μ²μμλf_visited[nx][ny] > j_visited[nx][ny]
λ‘ μκ°νλλ° μλμλ€. μ κ·Έλ°κ° νλ©΄ μ°λ¦¬κ°fire BFSλ¨κ³
μμ μ μΈνλf_visited[nx][ny] = f_visited[x][y] + 1
λ₯Ό λ μ¬λ €λ³΄μ.
λ¬Έμ λ₯Ό νλ©΄μ λμ ν κ°μ΄ μ‘νμ§ μλλ€λ©΄ ν΅μ¬ ννΈλ₯Ό μ΄ν΄λ³΄μ.
- λΆ(fire)κ³Ό μ§νμ΄μ
queue
λ₯Ό 2κ° μ μΈνκ³ λ°©λ¬Έ κΈ°λ‘λ λ§μ°¬κ°μ§λ‘ 2κ° μ μΈνλ€.(f_queue, j_queue / f_visited, j_visited) - μ§νμ΄μ λΆμ 맀 λΆλ§λ€ μ, ν, μ’, μ°λ‘ νΌμ§λ€.
- μ§νμ΄κ° λΆμ κ°νμ§ μκ³ μμ νκ² νμΆνλ €λ©΄ λΆμ΄ νΌμ§ μκ°λ³΄λ€ μ§νμ΄κ° μ΄λν μκ°μ΄ λ λΉ¨λΌμΌ νλ€.
- λ€μ λ§ν΄, ν μ’νμ κ°μ κΈ°μ€μΌλ‘ λΆλ³΄λ€ μ§νμ΄μ κ°μ΄ λ ν¬λ€λ©΄ κ·Έμͺ½μΌλ‘ μμ§μΌ μ μλ€.
- μ§νμ΄λ λ―Έλ‘μ κ°μ₯μ리μ μ ν κ³³μμ νμΆνλ€κ³ λμμλλ°, μ΄λ
(nx, ny)
μ’νκ° λ―Έλ‘μ λ²μλ₯Ό λ²μ΄λ λ νμΆμ΄ κ°λ₯νλ€. BFS
λ΄λΆμμqueue
λ 거리μμΌλ‘ λμ λλ€λ μ μ κΈ°μ΅νμ.- μ§νμ΄κ° λ―Έλ‘λ₯Ό λΉ μ Έλμ€μ§ λͺ»ν κ²½μ°λ
while
λ¬Έμ΄ μ’ λ£λ λκΉμ§λ μΆλ ₯μ΄ μλ κ²½μ°λκΉ κ·ΈλλIMPOSSIBLE
μ μΆλ ₯νμ.
λ, λ€λ₯Έ μ¬λμ νμ΄λ₯Ό μ°Ύμ보λκΉ λ€λ€ λ²μμ λ€μ΄μ€μ§ μλ κ²½μ°λ‘λ§ κ΅¬ν΄μ μ μμ΄ λΉν©νμλ€. λλ λμ²΄λ‘ BFS
λ¬Έμ λ λ²μμ λ€μ΄μ€λ κ²½μ°λ‘λ§ κ³μ°νκΈ° λλ¬Έμ μλ κ²½μ°λ₯Ό μ°Ύλ μ½λλ μμ μ΅μ§ μμλ€.
λ΄κ° μμ λ²μ μ½λλ₯Ό λ€μ μ μΆνλ μ΄μ λ 28λ²
μ½λμΈλ° λ¨μνκ² nx, ny
μ’νμμ λΆμ΄ λ°©λ¬Έν κ²½λ‘μ μ§νμ΄κ° λ°©λ¬Ένλ κ²½λ‘λ§ λΉκ΅νλ©΄ λ μ€ μμλλ κ·Έκ² μλμλ€. νΌλλ ꡬκΈλ§ λμ μ»μ λ°λ‘ ν
μ€νΈ μΌμ΄μ€λ₯Ό κ°μ Έμλ€. μ λμλ§ λΉκ΅νλ©΄ μ λλμ§ κ°μ΄ μ΄ν΄λ³΄μ.
'''
3 4
###F
.J#.
###.
'''
νμ¬ ν
μ€νΈ μΌμ΄μ€μμ f_visited
μ j_visited
μ κ²°κ³Όλ λ€μκ³Ό κ°λ€.
- f_visited = [[0, 0, 0, 1], [0, 0, 0, 2], [0, 0, 0, 3]]
- j_visited = [[0, 0, 0, 0], [0, 1, 0, 0], [0, 0, 0, 0]]
μ΄μνλ€. λΆλͺ
λΆμ΄ λ²μ§μ§ μμκ³ λ²½λ μλλ° μ j_visited[1][0]
μ리λ 2λ‘ λ°λμ§ μμ κ±°μ§?!
κ·Έ μ΄μ λ λΆμ΄ λ°©λ¬Ένμ§ μμκ²½μ°(not f_visited[nx][ny] or
)μλ μ μμ μΌλ‘ BFS
μ²λ¦¬λ₯Ό ν΄μ€μΌ νκΈ° λλ¬Έμ΄λ€. μ μ½λλ₯Ό λΉΌλ©΄ λ¨μν λΆμ΄ λ°©λ¬Έν κ²½λ‘μ μ§νμ΄κ° λ°©λ¬Έν κ²½λ‘μ μ’νλ§ λΉκ΅ν΄μ λ ν° κ°λ§ μΆλ ₯νκΈ° λλ¬Έμ λΆμ΄ λ°©λ¬Ένμ§ μμ κ²½λ‘λ BFS
μ²λ¦¬νμ§ μλλ€.
골λ λ¬Έμ μ μ΅μνμ§ μμμ κ·Έλ°μ§ λͺ¨λ₯΄κ² μ§λ§ λ°λ‘μ μΌμ΄μ€
μ μ€μμ±μ μ΄ λ¬Έμ λ₯Ό ν΅ν΄μ μ μκ² λλ€. λ°±μ€ μ§λ¬Έκ²μμμ 3κ°μ ν
μ€νΈ μΌμ΄μ€λ₯Ό λ κ°μ Έμλ€. νΉμλ νλ¦¬μ§ μλλ€λ©΄ λ€μμ μλν΄λ³΄μ.
'''
5 5
....F
...J#
....#
....#
...#.
μΆλ ₯: 4
---
3 3
F.F
.J.
F.F
μΆλ ₯: IMPOSSIBLE
---
5 5
#####
#...#
#.J.#
#...#
#####
μΆλ ₯: IMPOSSIBLE
'''
νλ¨μ μ½λλ 2κ°λ₯Ό κ°μ Έμλλ° λ²μλ₯Ό μμͺ½μΌλ‘ μ€μ ν μ½λ, λ²μλ₯Ό λ²μ΄λκ² μ€μ ν μ½λλ₯Ό κ°μ Έμλ€. λ μ€ μ΄ν΄κ° μλλ μ½λλ‘ μ¬μ©νμ. λλ 첫 λ²μ§Έ μ½λκ° μ΄ν΄κ° λ μλλ€.
μμ§ μ€λ² 1λ°μ λμ§ μμμ§λ§ 골λ λ¬Έμ 첫 μ κ³ μμ μ(?) μΉλ₯Έ κ² κ°λ€.
μ΄μ λ€λ₯Έ 골λ λ¬Έμ λ₯Ό νλ©΄μ μκ²½μ λ λΆλͺν보μ!
# in range case
import sys
from collections import deque
input = sys.stdin.readline
def bfs():
while f_queue: # fire BFS
x, y = f_queue.popleft()
for i in range(4):
nx = x + dx[i]
ny = y + dy[i]
if 0 <= nx < R and 0 <= ny < C:
if not f_visited[nx][ny] and graph[nx][ny] != '#':
f_visited[nx][ny] = f_visited[x][y] + 1
f_queue.append((nx, ny))
while j_queue: # jihoon BFS
x, y = j_queue.popleft()
for i in range(4):
nx = x + dx[i]
ny = y + dy[i]
if 0 <= nx < R and 0 <= ny < C:
if not j_visited[nx][ny] and graph[nx][ny] != '#':
if not f_visited[nx][ny] or f_visited[nx][ny] > j_visited[x][y] + 1: # important code
j_visited[nx][ny] = j_visited[x][y] + 1
j_queue.append((nx, ny))
else:
return j_visited[x][y] + 1 # escape map
return 'IMPOSSIBLE' # not escape map
dx = [1, 0, -1, 0]
dy = [0, 1, 0, -1]
R, C = map(int, input().split())
graph = [list(input().strip()) for _ in range(R)]
f_queue, j_queue = deque(), deque() # declare fire, jihoon queue
f_visited, j_visited = [[0] * C for _ in range(R)], [[0] * C for _ in range(R)] # declare fire, jihoon visited
for i in range(R):
for j in range(C):
if graph[i][j] == 'F':
f_queue.append((i, j))
elif graph[i][j] == 'J':
j_queue.append((i, j))
print(bfs())
# out range case(continue)
import sys
from collections import deque
input = sys.stdin.readline
def bfs():
while f_queue: # fire BFS
x, y = f_queue.popleft()
for i in range(4):
nx = x + dx[i]
ny = y + dy[i]
if nx < 0 or ny < 0 or nx >= R or ny >= C:
continue
if f_visited[nx][ny] != 0 or graph[nx][ny] == '#':
continue
f_visited[nx][ny] = f_visited[x][y] + 1
f_queue.append((nx, ny))
while j_queue: # jihoon BFS
x, y = j_queue.popleft()
for i in range(4):
nx = x + dx[i]
ny = y + dy[i]
if nx < 0 or ny < 0 or nx >= R or ny >= C:
return j_visited[x][y] + 1 # escape map
if j_visited[nx][ny] != 0 or graph[nx][ny] == '#' or (f_visited[nx][ny] != 0 and f_visited[nx][ny] <= j_visited[x][y]+1): # important code
continue
j_visited[nx][ny] = j_visited[x][y] + 1
j_queue.append((nx, ny))
return 'IMPOSSIBLE' # not escape map
dx = [1, 0, -1, 0]
dy = [0, 1, 0, -1]
R, C = map(int, input().split())
graph = [list(input().strip()) for _ in range(R)]
f_queue, j_queue = deque(), deque() # declare fire, jihoon queue
f_visited, j_visited = [[0] * C for _ in range(R)], [[0] * C for _ in range(R)] # declare fire, jihoon visited
for i in range(R):
for j in range(C):
if graph[i][j] == 'F':
f_queue.append((i, j))
elif graph[i][j] == 'J':
j_queue.append((i, j))
print(bfs())
'Algorithm > λ°±μ€(BOJ)' μΉ΄ν κ³ λ¦¬μ λ€λ₯Έ κΈ
[ νμ΄μ¬(python) ] λ°±μ€ 20053 - μ΅μ, μ΅λ 2 (0) | 2021.04.26 |
---|---|
[ νμ΄μ¬(python) ] λ°±μ€ 11659 - κ΅¬κ° ν© κ΅¬νκΈ°4 (5) | 2021.04.23 |
[ νμ΄μ¬(python) ] λ°±μ€ 1743 - μμλ¬ΌνΌνκΈ° (BFS) (0) | 2021.04.22 |
[ νμ΄μ¬(python) ] λ°±μ€ 1303 - μ μ - μ ν¬(BFS) (3) | 2021.04.21 |
[ νμ΄μ¬(python) ] λ°±μ€ 4963 - μ¬μ κ°μ(DFS) (0) | 2021.04.20 |
λκΈ