Skip to content

Cycles of light paths

1. Problem

해당 문제는 여기에서 확인하실 수 있습니다.

2. Answer

def solution(grid):
  # 상(0), 우(1), 하(2), 좌(3) 방향에 대한 행, 열 변화값
  dx = [-1, 0, 1, 0]
  dy = [0, 1, 0, -1]
  n = len(grid)      # 격자의 행 개수
  m = len(grid[0])   # 격자의 열 개수

  # 각 칸의 각 방향(상, 우, 하, 좌)에서 방문 여부를 저장하는 3차원 리스트
  # visited[x][y][d]가 True면 (x, y)칸에서 d방향으로 들어오는 경로는 이미 탐색됨을 의미
  visited = [[[False]*4 for _ in range(m)] for _ in range(n)]
  answer = []

  # 모든 칸, 모든 방향에서 출발하여 아직 방문하지 않은 경로를 탐색
  for x in range(n):
    for y in range(m):
      for d in range(4):
        # 방문하지 않은 경로에서만 사이클 탐색 시작
        if not visited[x][y][d]:
          cnt = 0  # 현재 사이클의 길이
          cx, cy, cd = x, y, d  # 현재 위치와 방향
          # 현재 경로가 사이클을 이루기 전까지 반복
          while not visited[cx][cy][cd]:
            visited[cx][cy][cd] = True  # 현재 칸, 방향 방문 처리
            cnt += 1  # 사이클 길이 증가

            # 현재 칸의 문자에 따라 방향 변경
            if grid[cx][cy] == 'L':
              cd = (cd - 1) % 4  # 'L'이면 좌회전(방향 -1)
            elif grid[cx][cy] == 'R':
              cd = (cd + 1) % 4  # 'R'이면 우회전(방향 +1)
            # 'S'면 방향 변화 없음

            # 다음 위치로 이동 (격자 밖으로 나가면 반대편으로 이동)
            cx = (cx + dx[cd]) % n
            cy = (cy + dy[cd]) % m

          # 사이클이 완성되면 그 길이를 결과 리스트에 추가
          if cnt > 0:
            answer.append(cnt)

  # 모든 사이클의 길이를 오름차순 정렬 후 반환
  answer.sort()
  return answer