개발자 톡
연습문제 톡
[HSAT 1회 정기 코딩 인증평가 기출] 안전운전을 도와줄 차세대 지능형 교통시스템
파이썬 DFS 구현했는데 시간 초과 원인을 잘 모르겠어요
- 등록일
- 2025-01-16 21:38:08
- 조회수
- 18
- 작성자
- minhaoffc
DFS 가지치기 잘하면 괜찮다고 하길래 중복 제거하려고 시점,방향,위치 고려한 가지치기 진행했는데도 여전히 시간 초과가 발생하네요.
오래 생각해봤는데도 이유를 잘 모르겠습니다.
혹시 짐작 가는 부분이 있으신 분이 계신가요?
import sys def dfs(depth, si, sj, sd, visited): # visited 관리 [i,j,d,t]: t시간에 (i,j)위치를 향해 d방향으로 들어옴 global global_visited if depth == T: global_visited.extend(visited) return rotary_key = arr[si][sj][depth%4] rotary_val = rotaryType[rotary_key] if rotary_val[0] == sd: flag = 0 for d in rotary_val[1]: ni, nj = si+di[d], sj+dj[d] if 0<=ni<N and 0<=nj<N and (ni,nj,d,(depth+1)%4) not in global_visited: flag = 1 visited.append((ni,nj,d,(depth+1)%4)) dfs(depth+1, ni, nj, d, visited) visited.remove((ni,nj,d,(depth+1)%4)) if flag == 0: global_visited.extend(visited) return else: global_visited.extend(visited) return # 상0 우1 하2 좌3 di = [-1, 0, 1, 0] dj = [0, 1, 0, -1] rotaryType = { 1 : [1,[0,1,2]], # [입력방향 인덱스, [출력방향 인덱스]] 2 : [0,[3,0,1]], 3 : [3,[2,3,0]], 4 : [2,[1,2,3]], 5 : [1,[0,1]], 6 : [0,[3,0]], 7 : [3,[2,3]], 8 : [2,[1,2]], 9 : [1,[1,2]], 10: [0,[0,1]], 11: [3,[3,0]], 12: [2,[2,3]] } N, T = map(int, input().split()) arr = [[[] for _ in range(N)] for _ in range(N)] for i in range(N): for j in range(N): tmp = list(map(int, input().split())) arr[i][j] = tmp global_visited = [] dfs(0, 0, 0, 0, [(0,0,0,0)]) # [i,j,d,t] result = [] for i,j,d,t in global_visited: if (i,j) not in result: result.append((i,j)) print(len(result))
#[HSAT_1회_정기_코딩_인증평가_기출]_안전운전을_도와줄_차세대_지능형_교통시스템