728x90
๋ถ๋ฅ : bfs, ์ฝ๊ฐ ๊ตฌํ
keypoint : storage ํ ๋๋ฆฌ๋ฅผ 0์ผ๋ก ์ฑ์ฐ๊ธฐ
๊ธฐ๋ณธ ๋ฐฐ์ด์ 0์ผ๋ก ์ํ์ข์ฐ๋ฅผ ๋๋ฌ์ค์ ์ ๊ทผ ๊ฐ๋ฅํ ์์ญ์ ๊ตฌ๋ถํ ์ ์๋ค.
code
def fork(storage, box): # ์ง๊ฒ์ฐจ
dx, dy = [0, 0, 1, -1], [1, -1, 0, 0]
index = []
for i in range(1, len(storage)-1):
for j in range(1, len(storage[0])-1):
if storage[i][j] == box:
for k in range(4):
nx, ny = i + dx[k], j + dy[k]
if storage[nx][ny] == "0": # ์ง๊ฒ์ฐจ๋ก ๊บผ๋ผ ์ ์์ผ๋ฉด (์ธ๋ถ์ชฝ ๋ฐ์ค)
index.append((i, j)) # ์์น ์ ์ฅ(๋ฐ๋ก ๊บผ๋ด๋ฉด ์์์๋ ๋ฐ์ค๋ ๊บผ๋ผ ์ ์๊ฒ ๋จ)
break
for i, j in index: # ์ ์ฅ๋ ๋ฐ์ค ๊บผ๋ด๊ธฐ
storage[i][j] = "0"
isOutside(storage, i, j) # ์ฃผ๋ณ์ ๋น ๊ณต๊ฐ์์ผ๋ฉด ์ธ๋ถ๋ ์ฐ๊ฒฐ
def crane(storage, box): # ํฌ๋ ์ธ
for i in range(1, len(storage)-1):
for j in range(1, len(storage[0])-1):
if storage[i][j] == box:
storage[i][j] = "1"
isOutside(storage, i, j) # ์ฃผ๋ณ์ ๋น ๊ณต๊ฐ์์ผ๋ฉด ์ธ๋ถ๋ ์ฐ๊ฒฐ
def isOutside(storage, x, y): # ๋ฐ์ค ๊บผ๋์ ๋ ์ธ๋ถ๋ ์ฐ๊ฒฐ๋ ๊ณต๊ฐ ์ฐพ์์ ์ฐ๊ฒฐ
dx, dy = [0, 0, 1, -1], [1, -1, 0, 0]
outside = False
for i in range(4):
nx, ny = x + dx[i], y + dy[i]
if storage[nx][ny] == "0": # ์ธ๋ถ๋ ์ฐ๊ฒฐ๋์ด ์์ผ๋ฉด
storage[x][y] = "0"
outside = True
break
if outside:
for i in range(4):
nx, ny = x + dx[i], y + dy[i]
if storage[nx][ny] == "1": # ๋น ๊ณต๊ฐ์ ์ธ๋ถ๋ ์ฐ๊ฒฐ "1" -> "0"
storage[nx][ny] = "0"
isOutside(storage, nx, ny) # ๋ถ์ด์๋ ๋น ๊ณต๊ฐ์ ๋ ์ฐพ๊ธฐ
def solution(storage, requests):
answer = 0
# 0 = ์ธ๋ถ๋ ์ฐ๊ฒฐ๋ ๊ณณ, 1 = ์ฌ๋ฐฉ์ด ๋งํ ๋น ๊ณต๊ฐ
storage = [list("0" + i + "0") for i in storage] # ํ
๋๋ฆฌ๋ฅผ "0"์ผ๋ก ์ฑ์ฐ๊ธฐ
storage.insert(0, list("0" * len(storage[0])))
storage.append(list("0" * len(storage[0])))
for q in requests:
if len(q) == 1:
fork(storage, q)
else:
crane(storage, q[0])
for i in range(1, len(storage)-1):
for j in range(1, len(storage[0])-1):
if storage[i][j] not in ["0", "1"]:
answer += 1
return answer
์ค์ํ ๋ด์ฉ lambda
# N×N 2์ฐจ์ ๋ฐฐ์ด
dy = (-1, 0, 1, 0)
dx = (0, 1, 0, -1)
# ๋ฐฉ๋ฌธํ ๋
ธ๋์ผ ๊ฒฝ์ฐ True / ๋ฐฉ๋ฌธํ์ง ์์ ๋
ธ๋์ผ ๊ฒฝ์ฐ False
visited = [[False for _ in range(N)] for _ in range(N)]
def BFS(r, c):
q = deque() # ํ์ํด์ผ ํ๋ ๋
ธ๋๋ค์ ๋ด๋ ํ
# ํ์์ ์์ํ๋ ๋
ธ๋ (r, c)
q.append((r, c))
visited[r][c] = True
route = [] # ํ์ ๊ฒฝ๋ก ์ ์ฅ
route.append((r, c))
# ํ์ ๋ค์ด๊ฐ ์๋ ๋
ธ๋๊ฐ ์์ ๋๊น์ง(ํ์์ด ์๋ฃ๋ ๋๊น์ง) ๋ฐ๋ณต
while q:
# ํ์ฌ ํ์ ์ค์ธ ๋
ธ๋ (y, x)
y, x = q.popleft()
for i in range(4):
# ์ธ์ ๋
ธ๋ (ny, nx)
ny = y + dy[i]
nx = x + dx[i]
# ์กฐ๊ฑด๋ฌธ์ ํตํด ํ์ ๊ฐ๋ฅํ ๋
ธ๋์ธ์ง ํ์ธ
if 0 <= ny < N and 0 <= nx < N and not visited[ny][nx]:
visited[ny][nx] = True
q.append((ny, nx)) # ์ธ์ ํ ๋
ธ๋๋ฅผ ์ ๋ถ ํ์ํ๊ธฐ ์ํด ํ์ ๋ค์ append
route.append((ny, nx))
return route
728x90