상상쓰

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

Coding Test

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

상상쓰 2021. 9. 13. 15:33

https://programmers.co.kr/learn/courses/30/lessons/86052

 

코딩테스트 연습 - 빛의 경로 사이클

각 칸마다 S, L, 또는 R가 써져 있는 격자가 있습니다. 당신은 이 격자에서 빛을 쏘고자 합니다. 이 격자의 각 칸에는 다음과 같은 특이한 성질이 있습니다. 빛이 "S"가 써진 칸에 도달한 경우, 직진

programmers.co.kr

 

사이클은 전체를 분할 한다.

즉, A 하고 B 사이클이 있을 때, A = B 이거나 A ∩ B = Φ 이다.

하나의 사이클의 원소는 grid[][] 에서 가지는 방향(상, 하, 좌, 우)라고 할 수 있다.

 

1. grid[][] 에서 상(-1, 0), 하(1, 0), 좌(0, -1), 우(0, 1) 를 시작으로 사이클을 만든다.

 

2. dic 의 key 는 grid[][] 의 좌푯값이고 value 는 해당 grid[][] 에서 빛이 이동했던 방향이다(list). dic[(i, j)] 에 k(방향) 이 있다면 이미 사이클로써 answer 에 값이 저장되었기 때문에 무시한다.

 

3. 없다면, 반복문을 돌려서 dic[] 에 중복되는 값이 생길 때까지(= 사이클이 끝날 때까지) 움직이는 경로마다 result 를 1씩 더하여 result 를 answer 에 담는다.

 

4. answer 를 sort() 하여 반환한다.

 

from collections import defaultdict

def solution(grid):
    answer = []
    grid = list(map(lambda x : list(x), grid))
    n, m = len(grid), len(grid[0])
    d = [(1, 0), (0, 1), (-1, 0), (0, -1)]
    dic = defaultdict(list)

    for i in range(len(grid)):
        for j in range(len(grid[0])):
            for k in d:
                if k not in dic[(i, j)]:
                    d1, d2 = k
                    x, y = i, j
                    result = 0
                    
                    while (d1, d2) not in dic[(x, y)]:
                        result += 1
                        dic[(x, y)].append((d1, d2))
                        x += d1
                        y += d2

                        if x == -1: x = n - 1
                        if x == n: x = 0
                        if y == -1: y = m - 1
                        if y == m: y = 0

                        s = grid[x][y]

                        if s == 'L': d1, d2 = (d2, d1) if d1 != 0 else (-d2, -d1)
                        if s == 'R': d1, d2 = (-d2, -d1) if d1 != 0 else (d2, d1)

                    answer.append(result)
    
    answer.sort()
    
    return answer

print(solution(['SL', 'LR'])) # [16]

'Coding Test' 카테고리의 다른 글

[백준] 윤년  (0) 2021.09.14
[백준] 퇴사  (0) 2021.09.14
[프로그래머스] 7주차_입실 퇴실  (0) 2021.09.13
[백준] 트리 순회  (0) 2021.09.10
[프로그래머스] 카드 짝 맞추기  (0) 2021.09.10
Comments