Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

[Algorithm] 양과 늑대 #21

Closed
hwangJi-dev opened this issue Sep 23, 2022 · 0 comments
Closed

[Algorithm] 양과 늑대 #21

hwangJi-dev opened this issue Sep 23, 2022 · 0 comments
Assignees

Comments

@hwangJi-dev
Copy link
Owner

hwangJi-dev commented Sep 23, 2022

💬 문제

문제 설명

2진 트리 모양 초원의 각 노드에 늑대와 양이 한 마리씩 놓여 있습니다. 이 초원의 루트 노드에서 출발하여 각 노드를 돌아다니며 양을 모으려 합니다. 각 노드를 방문할 때 마다 해당 노드에 있던 양과 늑대가 당신을 따라오게 됩니다. 이때, 늑대는 양을 잡아먹을 기회를 노리고 있으며, 당신이 모은 양의 수보다 늑대의 수가 같거나 더 많아지면 바로 모든 양을 잡아먹어 버립니다. 당신은 중간에 양이 늑대에게 잡아먹히지 않도록 하면서 최대한 많은 수의 양을 모아서 다시 루트 노드로 돌아오려 합니다.

예를 들어, 위 그림의 경우(루트 노드에는 항상 양이 있습니다) 0번 노드(루트 노드)에서 출발하면 양을 한마리 모을 수 있습니다. 다음으로 1번 노드로 이동하면 당신이 모은 양은 두 마리가 됩니다. 이때, 바로 4번 노드로 이동하면 늑대 한 마리가 당신을 따라오게 됩니다. 아직은 양 2마리, 늑대 1마리로 양이 잡아먹히지 않지만, 이후에 갈 수 있는 아직 방문하지 않은 모든 노드(2, 3, 6, 8번)에는 늑대가 있습니다. 이어서 늑대가 있는 노드로 이동한다면(예를 들어 바로 6번 노드로 이동한다면) 양 2마리, 늑대 2마리가 되어 양이 모두 잡아먹힙니다. 여기서는 0번, 1번 노드를 방문하여 양을 2마리 모은 후, 8번 노드로 이동한 후(양 2마리 늑대 1마리) 이어서 7번, 9번 노드를 방문하면 양 4마리 늑대 1마리가 됩니다. 이제 4번, 6번 노드로 이동하면 양 4마리, 늑대 3마리가 되며, 이제 5번 노드로 이동할 수 있게 됩니다. 따라서 양을 최대 5마리 모을 수 있습니다.

각 노드에 있는 양 또는 늑대에 대한 정보가 담긴 배열 info, 2진 트리의 각 노드들의 연결 관계를 담은 2차원 배열 edges가 매개변수로 주어질 때, 문제에 제시된 조건에 따라 각 노드를 방문하면서 모을 수 있는 양은 최대 몇 마리인지 return 하도록 solution 함수를 완성해주세요.


💬 Idea

  • 주어진 이진 트리를 활용하여 이동가능한 그래프를 만든다.
  • dfs를 사용하여 노드를 돈다.
    • 방문한 노드는 삭제 하고, 해당 노드가 방문가능한 노드들을 배열에 추가해준다.
  • 양의 개수가 늑대의 개수보다 많을 때만 dfs를 호출한다.

💬 풀이

var dfsGraph: [Int: [Int]] = [:]
var maxSheepCount = -1

func solution(_ info:[Int], _ edges:[[Int]]) -> Int {
    for edge in edges {
        if dfsGraph[edge[0]] != nil {
            dfsGraph[edge[0]]?.append(edge[1])
        } else {
            dfsGraph[edge[0]] = [edge[1]]
        }
    }
    
    // 루트 노드부터 탐색시 루트 노드에는 무조건 양이 있기 때문에 count를 [1,0]으로 전달한다.
    dfs(info, dfsGraph[0]!, [1,0])
    
    return maxSheepCount
}

func dfs(_ info: [Int], _ visitableNodes: [Int], _ count: [Int]) {
    maxSheepCount = max(count[0], maxSheepCount)
    
    for (index, visitNode) in visitableNodes.enumerated() {
        var nextVisitNodes = visitableNodes
        nextVisitNodes.remove(at: index)
        nextVisitNodes.append(contentsOf: dfsGraph[visitNode] ?? [])
        
        // 양과 늑대의 수 비교
        var nowCount = count
        if info[visitNode] == 0 {
            nowCount[0] += 1
        } else {
            nowCount[1] += 1
        }
        
        if nowCount[0] > nowCount[1] {
            dfs(info, nextVisitNodes, nowCount)
        }
    }
}

소요시간 : 1시간 21분


💬 알게된 문법

max(x, y)

  • 두 parameter를 비교하여 더 큰 것을 return한다.
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Projects
None yet
Development

No branches or pull requests

1 participant