너비 우선 탐색을 하자니 한 거울을 두 번 사용하는 경우가 마음에 걸렸음. 만약 [2,2] 위치에서 45도 짜리 거울을 썼다면 돌고 돌아 다시 [2,2]에 방문했을 때도 똑같이 45도 짜리 거울을 써야 하는 것 아닌가? 그래서 [2,2] 에 놓인 거울의 방향을 표시해줘야 한다면 기존에 어떻게 사용했는지를 기억해야 한다고 생각했고 BFS로 돌리기엔 비효율적 + 큐에 각 거울 배치를 넣어주자니 메모리초과가 뻔해서 DFS 를 써야 한다고 생각했음
하지만 그것은 틀렸습니다.

한심좌 짤방이 등장하면 적절할 듯 싶음. 느낌표(!) 영역은 거울방향을 조절할 수 있고, 돌고 돌아서 재방문했을 때 출구에 도달한다면 거울을 더 적게 사용할 수 있는 오른쪽 배치가 답일 것. 따라서 다시 재방문하는 경우는 가능은 하지만 최소 거울을 써야 한다는 조건에 의해 정답이 될 수가 없음
⇒ 그렇다면 BFS 를 쓰는 편이 시간적으로 유리함
우선순위 큐를 쓴다면 최소 거울이라는 조건을 만족시킬 수 있을 것이라고 생각
import sys
import heapq
N = int(sys.stdin.readline())
room = [list(sys.stdin.readline().rstrip()) for _ in range(N)]
v = [[[N*N for _ in range(4)] for _ in range(N)] for _ in range(N)]
dx = [0, 1, 0, -1]
dy = [1, 0, -1, 0]
def canGo(newX, newY):
global room, v
if newX < 0 or newX >= N or newY < 0 or newY >= N or room[newX][newY] == "*":
return False
else:
return True
q = []
start = [-1, -1]
flag = False
for i in range(N):
for j in range(N):
if room[i][j] == "#":
start = [i, j]
flag = True
for k in range(4):
newX, newY = i + dx[k], j + dy[k]
if canGo(newX, newY):
heapq.heappush(q, ([0, newX, newY, k]))
v[i][j][k] = 0
break
if flag:
break
while q:
mirror, x, y, d = heapq.heappop(q)
if room[x][y] == "#":
if x != start[0] or y != start[1]:
print(mirror)
exit(0)
else:
continue
if room[x][y] == ".":
newX, newY = x + dx[d], y + dy[d]
if canGo(newX, newY) and mirror < v[newX][newY][d]:
heapq.heappush(q, [mirror, newX, newY, d])
v[newX][newY][d] = mirror
elif room[x][y] == "!":
newX, newY = x + dx[d], y + dy[d]
if canGo(newX, newY) and mirror < v[newX][newY][d]:
heapq.heappush(q, [mirror, newX, newY, d])
v[newX][newY][d] = mirror
newD = (d - 1) % 4 # 오른쪽
newX, newY = x + dx[newD], y + dy[newD]
if canGo(newX, newY) and mirror+1 < v[newX][newY][newD]:
heapq.heappush(q, [mirror+1, newX, newY, newD])
v[newX][newY][newD] = mirror+1
newD = (d + 1) % 4 # 왼쪽
newX, newY = x + dx[newD], y + dy[newD]
if canGo(newX, newY) and mirror+1 < v[newX][newY][newD]:
heapq.heappush(q, [mirror+1, newX, newY, newD])
v[newX][newY][newD] = mirror+1
print(result)
방향의 경우 오른쪽(0)을 시작으로 시계방향
시간 초과능지 이슈