개발/알고리즘
[프로그래머스] 양과 늑대 풀이(python)
개발자_티모
2022. 10. 1. 15:28
반응형
풀이
- "당신은 중간에 양이 늑대에게 잡아먹히지 않도록 하면서..."
가장 중요한 점은 방문 순서가 상관이 없다는 점이다. 왜냐하면 방문한 노드의 양과 늑대를 다 더하고 늑대가 많다면 탐색을 잔행 하지 못하기 때문이다.
- 다시 루트 노드로 돌아오려 합니다."
노드의 재방문을 고민해보면 양방향 간선을 통해서 해결할 수 있다.
이 부분 때문에 2차원 배열의 메모제이션이 필요하다.
- dp는 cache[node][방문한 노드들] = 양의 최대 수
코드
from collections import defaultdict
nodes = []
edges = []
cache = []
def dfs(node, visited):
global nodes, edges
sheep = 0
wolf = 0
if cache[node][visited] != -1:
return cache[node][visited]
#방문 순서에 따른 wolf, sheep
for i in range(len(nodes)):
if visited & (1 << i) != 0:
if nodes[i] == 0:
sheep += 1
else:
wolf += 1
cache[node][visited] = 0
if sheep <= wolf:
return cache[node][visited]
cache[node][visited] = sheep
childes = []
for edge in edges:
if edge[0] == node:
childes.append(edge[1])
if edge[1] == node:
childes.append(edge[0])
for child in childes:
cache[node][visited] = max(cache[node][visited] , dfs(child, visited | (1 << child)))
return cache[node][visited]
def solution(info, edge):
global nodes, edges, cache
nodes = info
edges = edge
cache = [[-1] * (1 << 17) for _ in range(17)]
return dfs(0, 1)
if __name__ == "__main__":
info = [0,0,1,1,1,0,1,0,1,0,1,1]
edges = [[0,1],[1,2],[1,4],[0,8],[8,7],[9,10],[9,11],[4,3],[6,5],[4,6],[8,9]]
print(solution(info, edges))
문제
2진 트리 모양 초원의 각 노드에 늑대와 양이 한 마리씩 놓여 있습니다. 이 초원의 루트 노드에서 출발하여 각 노드를 돌아다니며 양을 모으려 합니다. 각 노드를 방문할 때 마다 해당 노드에 있던 양과 늑대가 당신을 따라오게 됩니다. 이때, 늑대는 양을 잡아먹을 기회를 노리고 있으며, 당신이 모은 양의 수보다 늑대의 수가 같거나 더 많아지면 바로 모든 양을 잡아먹어 버립니다.
"당신은 중간에 양이 늑대에게 잡아먹히지 않도록 하면서 최대한 많은 수의 양을 모아서 다시 루트 노드로 돌아오려 합니다."
반응형