fromtypingimportListdefsolution(info:List[int],edges:List[List[int]])->int:ROOT_INDEX=0SHEEP_NUMBER=0WOLF_NUMBER=1NOT_VISITED_NUMBER=0VISITED_NUMBER=1answer=[]visited=[NOT_VISITED_NUMBER]*len(info)defdfs(sheep,wolf):ifsheep<=wolf:returnanswer.append(sheep)# edges의 각 행은 [부모 노드 번호, 자식 노드 번호] 형태
forparent_node,child_nodeinedges:# 부모 노드가 방문된 상태, 자식 노드가 방문되지 않은 상태 -> 이래야 중복 방문을 피할 수 있음
ifvisited[parent_node]andnotvisited[child_node]:visited[child_node]=VISITED_NUMBERifinfo[child_node]==SHEEP_NUMBER:dfs(sheep+1,wolf)elifinfo[child_node]==WOLF_NUMBER:dfs(sheep,wolf+1)visited[child_node]=NOT_VISITED_NUMBERvisited[ROOT_INDEX]=VISITED_NUMBER# 0번 노드(루트 노드)에는 항상 양이 있음 (늑대는 없음)
dfs(1,0)returnmax(answer)
answer가 List<Integer>였다면 answer에 계속 add를 해가면서 마지막에 max 값을 구하면 됐지만, int[] 형일 경우는 무한대로 배열을 못 늘리니, 하나짜리로 생성 후 max의 값을 계속 갱신해주는 방식으로 해줄 수 있음
Leave a comment