[프로그래머스] 빛의 경로 사이클

최동혁·2022년 12월 22일
0

프로그래머스

목록 보기
33/68

풀이 방법

빛의 경로는 어디서 출발을 하든 같은 경로라면 같은 케이스라고 본다.
그렇기 때문에 빛이 한번 지나간 곳을 지나면 그것은 같은 케이스 일 수 밖에 없다
이유는 왼쪽에서 오른쪽으로 빛이 들어왔으면, 그것의 다음 경로는 무조건 서로 같을 수 밖에 없기 때문이다.
그래서 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

풀면서 어려웠던 점

  • 빛이 한번 지나가면 무조건 같은 경로라는 것을 파악하는데 시간이 매우 오래걸렸다.
  • 위의 의미가 매우 많은 것을 내포하고 있다고 생각하낟.
profile
항상 성장하는 개발자 최동혁입니다.

0개의 댓글