1. 문제
📌문제 보러 가기!
2. 접근법
- rolling 함수를 정의한다.
def rolling(graph, x, y, xx, yy, direction):
m = [(0, 1), (0, -1), (-1, 0), (1, 0)]
dx, dy = m[direction]
flag = False
while True:
x += dx
y += dy
if graph[x][y] == '#':
if flag:
return False, x - (2 * dx), y - (2 * dy)
else:
return False, x - dx, y - dy
elif graph[x][y] == 'O':
return True, x, y
elif (x, y) == (xx, yy):
flag = True
- N과 M을 입력받고 전체 그래프를 2차원 배열로 입력받는다.
N, M = map(int, input().split())
for i in range(N):
graph.append(list(input()))
for j in range(M):
if graph[i][j] == 'R':
rx, ry = i, j
graph[i][j] = '.'
elif graph[i][j] == 'B':
bx, by = i, j
graph[i][j] = '.'
- bfs를 진행한다. 이때, heapq를 사용하여 count 값이 가장 적은 순서대로 pop되도록 한다.
visited를 통해 중복 이동을 방지한다. defaultdict를 사용하여 빨간 구슬과 파란 구슬 해당 좌표에 동시에 존재한 적이 있는지 체크한다.
q = [(1, rx, ry, bx, by)]
heapq.heapify(q)
visited[(rx, ry, bx, by)] = True
while q:
cnt, rx, ry, bx, by = heapq.heappop(q)
if cnt > 10:
print(-1)
exit()
for i in range(4):
rtf, nrx, nry = rolling(graph, rx, ry, bx, by, i)
btf, nbx, nby = rolling(graph, bx, by, rx, ry, i)
if visited[(nrx, nry, nbx, nby)]:
continue
if btf:
continue
elif rtf:
print(cnt)
exit()
else:
heapq.heappush(q, (cnt + 1, nrx, nry, nbx, nby))
visited[(nrx, nry, nbx, nby)] = True
print(-1)
3. 전체 코드
import heapq
from collections import defaultdict
def rolling(graph, x, y, xx, yy, direction):
m = [(0, 1), (0, -1), (-1, 0), (1, 0)]
dx, dy = m[direction]
flag = False
while True:
x += dx
y += dy
if graph[x][y] == '#':
if flag:
return False, x - (2 * dx), y - (2 * dy)
else:
return False, x - dx, y - dy
elif graph[x][y] == 'O':
return True, x, y
elif (x, y) == (xx, yy):
flag = True
N, M = map(int, input().split())
graph = []
visited = defaultdict(bool)
rx, ry, bx, by = 0, 0, 0, 0
for i in range(N):
graph.append(list(input()))
for j in range(M):
if graph[i][j] == 'R':
rx, ry = i, j
graph[i][j] = '.'
elif graph[i][j] == 'B':
bx, by = i, j
graph[i][j] = '.'
q = [(1, rx, ry, bx, by)]
heapq.heapify(q)
visited[(rx, ry, bx, by)] = True
while q:
cnt, rx, ry, bx, by = heapq.heappop(q)
if cnt > 10:
print(-1)
exit()
for i in range(4):
rtf, nrx, nry = rolling(graph, rx, ry, bx, by, i)
btf, nbx, nby = rolling(graph, bx, by, rx, ry, i)
if visited[(nrx, nry, nbx, nby)]:
continue
if btf:
continue
elif rtf:
print(cnt)
exit()
else:
heapq.heappush(q, (cnt + 1, nrx, nry, nbx, nby))
visited[(nrx, nry, nbx, nby)] = True
print(-1)
정보에 감사드립니다.