π λ°±μ€ 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 |
λκΈ