문제 링크
내 풀이
# 양 > 늑대
# 방문했는지 안했는지 기록, 방문했으면 양,늑대 수 안더함
# 자신의 자식노드, 부모노드 중에 이동해도 양이 늑대수보다 많으면 이동가능
def is_valid_down(idx, visited, lamb, wolf, info): # 아래로는 안 방문한곳만 가기
if not visited[idx]:
if info[idx] == 1:
if lamb > wolf + 1:
wolf += 1
visited[idx] = True
return True
else:
return False
else:
lamb += 1
visited[idx] = True
return True
return False
def solution(info, edges):
lamb = 1 # 양, 늑대 초기 값
wolf = 0
parent_dict = {0: 0}
child_dict = {}
visited = [False for _ in range(len(info))]
visited[0] = True
for edge in edges:
parent, child = edge
parent_dict[child] = parent # 노드 별 부모노드 정보
if parent not in child_dict: # 노드 별 자식노드 정보
child_dict[parent] = [child]
else:
child_dict[parent].append(child)
for i in range(len(info)):
if i not in child_dict.keys():
child_dict[i] = None
node = 0
while True:
if node == 0 and visited[child_dict[0][0]] == True:
return lamb
if child_dict[node] != None or visited[node] != True:
for child in child_dict[node]:
if is_valid_down(child, visited, lamb, wolf, info):
node = child
break
else:
node = parent_dict[node]
다른 풀이
from collections import deque
def solution(info, edges):
def build_tree(info, edges):
tree = [[] for _ in range(len(info))]
for edge in edges:
tree[edge[0]].append(edge[1])
return tree
tree = build_tree(info, edges)
max_sheep = 0
q = deque([(0, 1, 0, set())])
while q:
current, sheep_count, wolf_count, visited = q.popleft()
max_sheep = max(max_sheep, sheep_count)
visited.update(tree[current])
for next_node in visited:
if info[next_node]:
if sheep_count != wolf_count + 1:
q.append(
(next_node, sheep_count, wolf_count + 1, visited - {next_node})
)
else:
q.append(
(next_node, sheep_count + 1, wolf_count, visited - {next_node})
)
return max_sheep
댓글남기기