1dx = [1, 0, -1, 0]
2dy = [0, 1, 0, -1]
3def solution(grid):
4 N = len(grid)
5 M = len(grid[0])
6 grid = [list(line) for line in grid]
7 route = [[[False]*4 for _ in range(M)] for _ in range(N)]
8 answer = []
9
10 for i in range(M):
11 for j in range(N):
12 for k in range(4):
13 cur = [i, j]
14 dir = k
15 cnt = 0
16 while not route[cur[1]][cur[0]][dir]:
17 cnt += 1
18 route[cur[1]][cur[0]][dir] = True
19 cur[0] = (cur[0]+dx[dir]) % M
20 cur[1] = (cur[1]+dy[dir]) % N
21
22 if grid[cur[1]][cur[0]] == 'L':
23 dir = (dir-1) % 4
24 elif grid[cur[1]][cur[0]] == 'R':
25 dir = (dir+1) % 4
26 if cnt != 0:
27 answer.append(cnt)
28
29 return sorted(answer)
문제
- 각 칸마다 S, L, 또는 R가 써져 있는 격자가 있다
- 격자에 빛을 쏘고자 한다
- 빛이 도달한 칸이 S칸이면 직진, L이면 왼쪽으로, R이면 오른쪽으로 꺾는다
- 빛이 격자를 넘어간 경우, 반대쪽 끝으로 다시 돌아온다
- 빛이 이동할 수 있는 경로 사이클의 길이를 오름차순으로 정렬하여 반환하라
- TC
- input
[“SL”,“LR”]
- ouput
[16]
- input
해결방법
- route라는 배열에 각 칸마다 빛이 어느 방향으로 이동했는지 기록한다
- 똑같은 경로로 빛이 이동할 때까지 cnt를 증가시켜서 answer에 넣는다
- 위 과정을 빛을 쏜 적 없는 모든 경우에 대해 반복한다
배운 점
- 나머지 연산을 이용해서 음수를 처리할 수 있다는 것을 알게되었다
- ex) -1 % 4 = 3