빛의 경로는 어디서 출발을 하든 같은 경로라면 같은 케이스라고 본다.
그렇기 때문에 빛이 한번 지나간 곳을 지나면 그것은 같은 케이스 일 수 밖에 없다
이유는 왼쪽에서 오른쪽으로 빛이 들어왔으면, 그것의 다음 경로는 무조건 서로 같을 수 밖에 없기 때문이다.
그래서 3차원 배열을 이용하여 방문 배열을 설정해주고, 이미 방문할 때까지 count를 새주고 정답 배열에 넣어준다.
from collections import deque
def solution(grid):
answer = []
vis = [[[False for _ in range(8)] for _ in range(len(grid[0]))] for _ in range(len(grid))]
# 상(out) : 0
# 상(in) : 1
# 좌(out) : 2
# 좌(in) : 3
# 하(out) : 4
# 하(in) : 5
# 우(out) : 6
# 우(in) : 7
# 처음 시작은 1행 1열의 아무곳이나 잡고 시작
# 다 구하고 나서 방문 하지 않은 곳 중
for a in range(len(grid)):
origin_a = a
for b in range(len(grid[0])):
origin_b = b
for c in range(1, 8, 2):
origin_c = c
if vis[origin_a][origin_b][origin_c]:
continue
else:
count = 0
a = origin_a
b = origin_b
c = origin_c
while True:
if grid[a][b] == "L":
if c + 2 > 7:
c = 1
else:
c += 2
elif grid[a][b] == "R":
if c - 2 >= 0:
c -= 2
else:
c = 7
current_a = a
current_b = b
if c == 1:
if a + 1 < len(grid):
a += 1
else:
a = 0
elif c == 3:
if b + 1 < len(grid[0]):
b += 1
else:
b = 0
elif c == 5:
if a - 1 >= 0:
a -= 1
else:
a = len(grid) - 1
elif c == 7:
if b - 1 >= 0:
b -= 1
else:
b = len(grid[0]) - 1
after_c = c + 3
if after_c > 7:
after_c -= 8
if not vis[a][b][c]:
vis[current_a][current_b][after_c] = True
vis[a][b][c] = True
count += 1
else:
answer.append(count)
break
answer = sorted(answer)
return answer