사용자 도구

사이트 도구


ps:problems:programmers:86052

빛의 경로 사이클

ps
링크programmers.co.kr/…
출처프로그래머스
문제 번호86052
문제명빛의 경로 사이클
레벨Level 2
분류

구현

시간복잡도O(nm)
인풋사이즈n<=500, m<=500
사용한 언어Python
해결날짜2022/01/12

풀이

  • 각 노드들에 대해서 다음 노드들이 주어져있을때, 사이클을 모두 찾는 문제이다. 처음 노드를 시작점으로 해서 경로대로 따라가며 사이클을 찾고, 그 다음에는 아직 방문하지 않았던 노드를 골라서 그 노드를 시작점으로 하는 사이클을 찾고, 이것을 모든 노드를 방문할때까지 수행하면 된다.
  • 기본적인 사이클 찾기 문제들에 비해 조금 신경써야 할것은, 좌표 한개를 상태로 하는 것이 아니라, (좌표, 방향)이 상태가 된다는 것. 그래서 노드의 갯수는 R*C*4 가 된다.
  • 시간 복잡도는 노드의 갯수인 O(R*C*4) = O(R*C)

코드

"""Solution code for "Programmers 86052. 빛의 경로 사이클".

- Problem link: https://programmers.co.kr/learn/courses/30/lessons/86052
- Solution link: http://www.teferi.net/ps/problems/programmers/86052
"""

import itertools

DELTAS = ((0, 1), (1, 0), (0, -1), (-1, 0))


def solution(grid):
    answer = []
    row_num, col_num = len(grid), len(grid[0])
    is_visited = [[[False] * 4 for _ in grid[0]] for _ in grid]
    for r in range(row_num):
        for c in range(col_num):
            cur_r, cur_c = r, c
            for dir_id in range(4):
                if is_visited[r][c][dir_id]:
                    continue
                for i in itertools.count():
                    if is_visited[cur_r][cur_c][dir_id]:
                        answer.append(i)
                        break
                    is_visited[cur_r][cur_c][dir_id] = True
                    dr, dc = DELTAS[dir_id]
                    cur_r = (cur_r + dr) % row_num
                    cur_c = (cur_c + dc) % col_num
                    if grid[cur_r][cur_c] == 'L':
                        dir_id = (dir_id + 1) % 4
                    elif grid[cur_r][cur_c] == 'R':
                        dir_id = (dir_id - 1) % 4

    return sorted(answer)

토론

댓글을 입력하세요:
I V᠎ I P Q
 
ps/problems/programmers/86052.txt · 마지막으로 수정됨: 2022/01/12 10:00 저자 teferi