2021. 3. 29. 15:25ใ๐ Algorithm/๐ช๐ป Python ๋ฌธ์ ํ์ด
๋ฌธ์ ์ค๋ช
์คํํธ๋งํฌ์์ ํ๋งคํ๋ ์ด๋ฆฐ์ด์ฉ ์ฅ๋๊ฐ ์ค์์ ๊ฐ์ฅ ์ธ๊ธฐ๊ฐ ๋ง์ ์ ํ์ ๊ตฌ์ฌ ํ์ถ์ด๋ค. ๊ตฌ์ฌ ํ์ถ์ ์ง์ฌ๊ฐํ ๋ณด๋์ ๋นจ๊ฐ ๊ตฌ์ฌ๊ณผ ํ๋ ๊ตฌ์ฌ์ ํ๋์ฉ ๋ฃ์ ๋ค์, ๋นจ๊ฐ ๊ตฌ์ฌ์ ๊ตฌ๋ฉ์ ํตํด ๋นผ๋ด๋ ๊ฒ์์ด๋ค.
๋ณด๋์ ์ธ๋ก ํฌ๊ธฐ๋ N, ๊ฐ๋ก ํฌ๊ธฐ๋ M์ด๊ณ , ํธ์์ 1×1ํฌ๊ธฐ์ ์นธ์ผ๋ก ๋๋์ด์ ธ ์๋ค. ๊ฐ์ฅ ๋ฐ๊นฅ ํ๊ณผ ์ด์ ๋ชจ๋ ๋งํ์ ธ ์๊ณ , ๋ณด๋์๋ ๊ตฌ๋ฉ์ด ํ๋ ์๋ค. ๋นจ๊ฐ ๊ตฌ์ฌ๊ณผ ํ๋ ๊ตฌ์ฌ์ ํฌ๊ธฐ๋ ๋ณด๋์์ 1×1ํฌ๊ธฐ์ ์นธ์ ๊ฐ๋ ์ฑ์ฐ๋ ์ฌ์ด์ฆ์ด๊ณ , ๊ฐ๊ฐ ํ๋์ฉ ๋ค์ด๊ฐ ์๋ค. ๊ฒ์์ ๋ชฉํ๋ ๋นจ๊ฐ ๊ตฌ์ฌ์ ๊ตฌ๋ฉ์ ํตํด์ ๋นผ๋ด๋ ๊ฒ์ด๋ค. ์ด๋, ํ๋ ๊ตฌ์ฌ์ด ๊ตฌ๋ฉ์ ๋ค์ด๊ฐ๋ฉด ์ ๋๋ค.
์ด๋, ๊ตฌ์ฌ์ ์์ผ๋ก ๊ฑด๋๋ฆด ์๋ ์๊ณ , ์ค๋ ฅ์ ์ด์ฉํด์ ์ด๋ฆฌ ์ ๋ฆฌ ๊ตด๋ ค์ผ ํ๋ค. ์ผ์ชฝ์ผ๋ก ๊ธฐ์ธ์ด๊ธฐ, ์ค๋ฅธ์ชฝ์ผ๋ก ๊ธฐ์ธ์ด๊ธฐ, ์์ชฝ์ผ๋ก ๊ธฐ์ธ์ด๊ธฐ, ์๋์ชฝ์ผ๋ก ๊ธฐ์ธ์ด๊ธฐ์ ๊ฐ์ ๋ค ๊ฐ์ง ๋์์ด ๊ฐ๋ฅํ๋ค.
๊ฐ๊ฐ์ ๋์์์ ๊ณต์ ๋์์ ์์ง์ธ๋ค. ๋นจ๊ฐ ๊ตฌ์ฌ์ด ๊ตฌ๋ฉ์ ๋น ์ง๋ฉด ์ฑ๊ณต์ด์ง๋ง, ํ๋ ๊ตฌ์ฌ์ด ๊ตฌ๋ฉ์ ๋น ์ง๋ฉด ์คํจ์ด๋ค. ๋นจ๊ฐ ๊ตฌ์ฌ๊ณผ ํ๋ ๊ตฌ์ฌ์ด ๋์์ ๊ตฌ๋ฉ์ ๋น ์ ธ๋ ์คํจ์ด๋ค. ๋นจ๊ฐ ๊ตฌ์ฌ๊ณผ ํ๋ ๊ตฌ์ฌ์ ๋์์ ๊ฐ์ ์นธ์ ์์ ์ ์๋ค. ๋, ๋นจ๊ฐ ๊ตฌ์ฌ๊ณผ ํ๋ ๊ตฌ์ฌ์ ํฌ๊ธฐ๋ ํ ์นธ์ ๋ชจ๋ ์ฐจ์งํ๋ค. ๊ธฐ์ธ์ด๋ ๋์์ ๊ทธ๋งํ๋ ๊ฒ์ ๋ ์ด์ ๊ตฌ์ฌ์ด ์์ง์ด์ง ์์ ๋ ๊น์ง์ด๋ค.
๋ณด๋์ ์ํ๊ฐ ์ฃผ์ด์ก์ ๋, ์ต์ ๋ช ๋ฒ ๋ง์ ๋นจ๊ฐ ๊ตฌ์ฌ์ ๊ตฌ๋ฉ์ ํตํด ๋นผ๋ผ ์ ์๋์ง ๊ตฌํ๋ ํ๋ก๊ทธ๋จ์ ์์ฑํ์์ค.
์ ๋ ฅํ์
์ฒซ ๋ฒ์งธ ์ค์๋ ๋ณด๋์ ์ธ๋ก, ๊ฐ๋ก ํฌ๊ธฐ๋ฅผ ์๋ฏธํ๋ ๋ ์ ์ N, M (3 ≤ N, M ≤ 10)์ด ์ฃผ์ด์ง๋ค. ๋ค์ N๊ฐ์ ์ค์ ๋ณด๋์ ๋ชจ์์ ๋ํ๋ด๋ ๊ธธ์ด M์ ๋ฌธ์์ด์ด ์ฃผ์ด์ง๋ค. ์ด ๋ฌธ์์ด์ '.', '#', 'O', 'R', 'B' ๋ก ์ด๋ฃจ์ด์ ธ ์๋ค. '.'์ ๋น ์นธ์ ์๋ฏธํ๊ณ , '#'์ ๊ณต์ด ์ด๋ํ ์ ์๋ ์ฅ์ ๋ฌผ ๋๋ ๋ฒฝ์ ์๋ฏธํ๋ฉฐ, 'O'๋ ๊ตฌ๋ฉ์ ์์น๋ฅผ ์๋ฏธํ๋ค. 'R'์ ๋นจ๊ฐ ๊ตฌ์ฌ์ ์์น, 'B'๋ ํ๋ ๊ตฌ์ฌ์ ์์น์ด๋ค.
์ ๋ ฅ๋๋ ๋ชจ๋ ๋ณด๋์ ๊ฐ์ฅ์๋ฆฌ์๋ ๋ชจ๋ '#'์ด ์๋ค. ๊ตฌ๋ฉ์ ๊ฐ์๋ ํ ๊ฐ ์ด๋ฉฐ, ๋นจ๊ฐ ๊ตฌ์ฌ๊ณผ ํ๋ ๊ตฌ์ฌ์ ํญ์ 1๊ฐ๊ฐ ์ฃผ์ด์ง๋ค.
์ถ๋ ฅํ์
์ต์ ๋ช ๋ฒ ๋ง์ ๋นจ๊ฐ ๊ตฌ์ฌ์ ๊ตฌ๋ฉ์ ํตํด ๋นผ๋ผ ์ ์๋์ง ์ถ๋ ฅํ๋ค. ๋ง์ฝ, 10๋ฒ ์ดํ๋ก ์์ง์ฌ์ ๋นจ๊ฐ ๊ตฌ์ฌ์ ๊ตฌ๋ฉ์ ํตํด ๋นผ๋ผ ์ ์์ผ๋ฉด -1์ ์ถ๋ ฅํ๋ค.
์ ์ถ๋ ฅ ์์
ํ์ด ๊ณผ์
BFS๋ฅผ ์ด์ฉํ์ฌ ํ์ด์ผ๊ฒ ๋ค๊ณ ์๊ฐํ๋๋ฐ ๊ตฌ์ฌ์ด ํ์นธ์ฉ ์ด๋ํ๋ ๊ฒ์ด ์๋ ์ํ์ข์ฐ ๊ธฐ์ธ์ฌ์ #์ ๋ถ๋ช์น๊ธฐ ์ ๊น์ง ์ด๋ํด์ผ ํ๋ค๋ ๊ฒ๊ณผ ๋นจ๊ฐ ๊ตฌ์ฌ, ํ๋ ๊ตฌ์ฌ ๋ ๋ค ์์ง์ด๋ ๊ฒ์ด ์ฝ์ง์์ ๋ฌธ์ ์๋ค.
while๋ฌธ์ ์ด์ฉํ์ฌ '#' ๊ฐ ๋๊ธฐ ์ ๊น์ง ์ด๋ํ๋๋ก move ํจ์๋ฅผ ์งฐ๊ณ , ์ด๋ํ new_bx,by new_rx,ry๊ฐ ๋ง์ฝ ๊ฐ์ ์์น์ ์์ผ๋ฉด ์ข ๋ ๋ง์ด ์ด๋ํ ๊ฒ์ dx,dy ๋งํผ ๋นผ์ฃผ๋ ์์ผ๋ก ๊ตฌํํ๋ค. ๋๋จธ์ง๋ BFS ๊ธฐ๋ณธ ๋ฐฉ์๊ณผ ๋์ผํ๊ฒ ๊ตฌํํ ์ ์์๋ค.
from collections import deque
def move(x, y, dx, dy):
cnt = 0
while board[x + dx][y + dy] != '#' and board[x][y] != 'O':
x += dx
y += dy
cnt += 1
return x, y, cnt
def bfs(rx,ry,bx,by):
queue = deque()
queue.append((rx, ry, bx, by,1))
visited[rx][ry][bx][by] = True
dxy = [(-1, 0), (1, 0), (0, 1), (0, -1)]
while queue:
rx, ry, bx, by,depth = queue.popleft()
if depth > 10:
break
for dx, dy in dxy:
new_rx, new_ry, rcnt = move(rx, ry, dx, dy)
new_bx, new_by, bcnt = move(bx, by, dx, dy)
if board[new_bx][new_by] != 'O':
if board[new_rx][new_ry] == 'O':
return depth
if new_rx == new_bx and new_ry == new_by:
if rcnt > bcnt:
new_rx -= dx
new_ry -= dy
else:
new_bx -= dx
new_by -= dy
if not visited[new_rx][new_ry][new_bx][new_by]:
visited[new_rx][new_ry][new_bx][new_by] = True
queue.append((new_rx, new_ry, new_bx, new_by,depth+1))
return -1
if __name__ == '__main__':
row, col = map(int, input().split())
board = [list(input().strip()) for _ in range(row)]
visited = [[[[False] * col for _ in range(row)] for _ in range(col)] for _ in range(row)]
for i in range(row):
for j in range(col):
if board[i][j] == 'R':
rx,ry = i,j
if board[i][j] == 'B':
bx,by = i,j
print(bfs(rx,ry,bx,by))
'๐ Algorithm > ๐ช๐ป Python ๋ฌธ์ ํ์ด' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
[Python - ๋ฐฑ์ค 13458] ์ํ๊ฐ๋ (0) | 2021.03.31 |
---|---|
[Python - ํ๋ก๊ทธ๋๋จธ์ค Level2] ์ต์๊ฐ ๋ง๋ค๊ธฐ (0) | 2021.02.01 |
[Python - ํ๋ก๊ทธ๋๋จธ์ค Level3] ๋ฑ๊ตฃ๊ธธ (0) | 2021.02.01 |