ํฐ์คํ ๋ฆฌ ๋ทฐ
728x90
๋ฐ์ํ
๋ฌธ์
๋ฌธ์ ํ์ด
NxM ํฌ๊ธฐ์ ๋ณด๋์ 4๊ฐ์ ๋ฒํผ์ผ๋ก ์ด๋ฃจ์ด์ง ๊ฒ์์์ ๋ฒํผ์ ํด๋ฆญํ์ฌ ํ๋์ ๋์ ์ ๋ณด๋ ๋ฐ์ผ๋ก ๋ณด๋ด๋ ๋ฌธ์ ์ด๋ค. ๋ฒํผ์ ์, ํ, ์ข, ์ฐ๋ก 2๊ฐ์ ๋์ ์ ๋์์ ์์ง์ด๊ฒ ํ๋ค. ์ด๋ ์ต์๋ก ๋ฒํผ์ ํด๋ฆญํ์ฌ ํ๋์ ๋์ ์ ๋ณด๋ ๋ฐ์ผ๋ก ๋ณด๋ด๋ ๊ฒฝ์ฐ๋ฅผ ๋ฐํํ๋ ๋ฌธ์ ์ด๋ค.
์ด ๋ฌธ์ ๋ ์์ ๋ค๋ฃฌ, ๊ตฌ์ฌ ํ์ถ, ๊ตฌ์ฌ ํ์ถ 3์ ์๋นํ ์ ์ฌํ ๋ฌธ์ ์ด๋ค. ์ด ๋ฌธ์ ๋ฅผ ํ ์ ์๋ ๋ก์ง์ ๊ธฐ์ตํ๋ค๋ฉด ํด๋น ๋ฌธ์ ์ญ์ ์ฝ๊ฒ ํ ์ ์๋ค. ๋ฌธ์ ๋ ๋ค์ ๋ก์ง๊ณผ ๊ฐ์ด ์ ๊ทผํ๋ฉด ๋ต์ ์ฐพ์ ์ ์๋ค.
- BFS๋ฅผ ํตํด ํ์์ ํ๋ค.
- ๋์ ์ ๋์์ ์, ํ, ์ข, ์ฐ ์ขํ ์ค ํ๋๋ก ์์ง์ธ๋ค.
- ์๋ ํ์๊ฐ 10ํ ์ด์์ด๋ผ๋ฉด ์ค๋จํ๊ณ , -1์ ๋ฐํํ๋ค.
- ๋ ๋์ ๋ชจ๋ ๋ฐ์ผ๋ก ๋จ์ด์ง๋ค๋ฉด, ํ์์์ ์ ์ธํ๋ค.
- ๋ ๋์ ์ค ํ๋๋ง ๋ฐ์ผ๋ก ๋จ์ด์ง๋ค๋ฉด ๋ต์ ์ฐพ์ ๊ฒ์ด๋ฏ๋ก, ์๋ ํ์๋ฅผ ๋ฐํํ๋ค.
- ๋์ ์ด ๋ฒฝ๊ณผ ๋ง๋๋ค๋ฉด, ํ์ฌ์ ๊ฒฝ๋ก๋ฅผ ์ ์งํ๋ค.
- ๊ฐ ์ขํ์ ๊ฒฝ๋ก๋ฅผ ๋ฐฉ๋ฌธํ์๋์ง ํ์ธํ๊ณ , ๋ฐฉ๋ฌธํ์ง ์์๋ค๋ฉด ํ์ ์ถ๊ฐํ๋ค.
์ฝ๋
from sys import stdin
from collections import deque
def search_coin():
location = []
for i in range(n):
for j in range(m):
if graph[i][j] == 'o':
location.append([i, j])
return location
def visitable(x, y):
return 0 <= x < n and 0 <= y < m
def bfs(coins):
q = deque([[coins[0], coins[1], 1]])
visited[coins[0][X]][coins[0][Y]][coins[1][X]][coins[1][Y]] = True
while q:
one, two, cnt = q.popleft()
# cnt๊ฐ 10์ด ๋์ด๋ ์ฐพ์ง ๋ชปํ๋ฉด ์ฐพ์ ์ ์๋ ๊ฒฝ์ฐ.
if cnt > 10:
break
for dx, dy in dirs:
# ๊ฐ๊ฐ์ ๋์ ์ ์ด๋ ์ํด.
next_one = [one[X] + dx, one[Y] + dy]
next_two = [two[X] + dx, two[Y] + dy]
# ๋ ๋์ ๋ชจ๋, ๋ฐฉ๋ฌธ ๊ฐ๋ฅํ์ง ์์ ์์น๋ก ๊ฐ๋ค๋ฉด ํ์ํ์ง ์์๋ ๋จ.
if not visitable(*next_one) and not visitable(*next_two):
continue
# ๋์ 1์ ๋ค์ ์์น๊ฐ ๋ฐ์ด๊ฑฐ๋, ๋์ 2์ ๋ค์ ์์น๊ฐ ๋ฐ์ธ ๊ฒฝ์ฐ
# ์ต์ ๋ฒํผ ํด๋ฆญ์ ๋ฐํํ๊ณ ์ข
๋ฃ.
if visitable(*next_one) and not visitable(*next_two) or \
not visitable(*next_one) and visitable(*next_two):
return cnt
# ๋์ ์ด ๋ฒฝ๊ณผ ๋ง๋ ๊ฒฝ์ฐ, ํ์ฌ ์์น์์ ๊ณ ์ .
if graph[next_one[X]][next_one[Y]] == '#':
next_one = one
if graph[next_two[X]][next_two[Y]] == '#':
next_two = two
# ๋ฐฉ๋ฌธํ์ง ์์ ๊ฒฝ์ฐ, ๊ฒฝ๋ก ํ์์ ์ํด ํ์ ์ถ๊ฐํจ.
if not visited[next_one[X]][next_one[Y]][next_two[X]][next_two[Y]]:
visited[next_one[X]][next_one[Y]][next_two[X]][next_two[Y]] = True
q.append([next_one, next_two, cnt + 1])
return -1
if __name__ == '__main__':
X, Y = 0, 1
dirs = [(0, 1), (0, -1), (1, 0), (-1, 0)]
n, m = map(int, stdin.readline().split())
graph = [list(stdin.readline().rstrip()) for _ in range(n)]
# ๋ฐฉ๋ฌธ ์ํ๋ฅผ ๋์ ๋๊ฐ์ ์ขํ์ ๋ฐ๋ผ ์ฒดํฌํ๊ธฐ ์ํด 4์ฐจ์ ๋ฐฐ์ด ์ ์ธ.
visited = \
[[[[False] * m for _ in range(n)] for _ in range(m)] for _ in range(n)]
print(bfs(search_coin()))
728x90
๋ฐ์ํ
'๐จโ๐ป ์ฝ๋ฉํ ์คํธ > ๋ฐฑ์ค' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
๋ฐฑ์ค: 16938 ์บ ํ ์ค๋น (0) | 2020.09.26 |
---|---|
๋ฐฑ์ค: 12869 ๋ฎคํ๋ฆฌ์คํฌ (0) | 2020.09.25 |
๋ฐฑ์ค: 15686 ์นํจ ๋ฐฐ๋ฌ (0) | 2020.09.24 |
๋ฐฑ์ค: 2210 ์ซ์ํ ์ ํ (0) | 2020.09.24 |
๋ฐฑ์ค: 3568 iSharp (0) | 2020.09.24 |
๋๊ธ
๊ธ ๋ณด๊ดํจ
์ต๊ทผ์ ์ฌ๋ผ์จ ๊ธ
์ต๊ทผ์ ๋ฌ๋ฆฐ ๋๊ธ