빛의 경로 사이클 - python

참치돌고래·2021년 11월 16일
1

알고리즘

목록 보기
32/36

위클리 챌린지

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


기존 dfs 알고리즘에서 빛이 나가는 4가지의 방향을 고려하여 코드를 작성하였습니다.
빛이 한 지점에서 4가지 방향 중 하나로 나가면 1로 설정하여 경로를 체크하였습니다.
만약 빛이 사이클을 돌다가 중복으로 나간다면 (1로 체크된 방향을 중복해서 지나가면) while문을 중단하고 여태 센 cnt를 반환해줍니다.
나아가는 방향 계산은 S일 경우에는 따로 계산하지 않고 그대로 방향에 좌표를 더해주고, LR일 때만 따로 계산하여 좌표에 더해주었습니다. 만약 계산결과가 인덱스를 벗어나는 결과가 나오면 다시 처음으로 돌아가기 때문에 나머지 연산을 통해 해당 계산을 구현하였습니다.


def dfs(i,j,k,field,grid):
    dx = [1,0,-1,0]
    dy = [0,-1,0,1]
    cnt = 0
    row = len(grid)
    col = len(grid[0])
    
    while True:
        if field[i][j][k] == 1:
            return (cnt)
        
        field[i][j][k] = 1
        i = (i + dx[k]) % row
        j = (j + dy[k]) % col
        
        if grid[i][j] == 'R':
            k = (k + 1) % 4

        elif grid[i][j] == 'L':
            k = (k + 3) % 4
        
        cnt += 1

def solution(grid):
    answer = []
    row = len(grid)
    col = len(grid[0])
    field = [[[0,0,0,0] for i in range(col)] for j in range(row)]
    
    
    for i in range(row):
        for j in range(col):
            for k in range(4):
                if field[i][j][k] == 0:
                    answer.append(dfs(i,j,k,field,grid))
    answer.sort()
    
    return answer
profile
안녕하세요

1개의 댓글

comment-user-thumbnail
2022년 4월 12일

저는 이거 못풀었는데 대단하시네요 참치돌고래님!

답글 달기