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)
ps/problems/programmers/86052.txt · 마지막으로 수정됨: 2022/01/12 10:00 저자 teferi
토론