본문 바로가기

알고리즘

2022 KAKAO Blind 양과 늑대

https://programmers.co.kr/learn/courses/30/lessons/92343?language=python3 

 

코딩테스트 연습 - 양과 늑대

[0,0,1,1,1,0,1,0,1,0,1,1] [[0,1],[1,2],[1,4],[0,8],[8,7],[9,10],[9,11],[4,3],[6,5],[4,6],[8,9]] 5 [0,1,0,1,1,0,1,0,0,1,0] [[0,1],[0,2],[1,3],[1,4],[2,5],[2,6],[3,7],[4,8],[6,9],[9,10]] 5

programmers.co.kr

 

 

처음 봤을 땐 그래프를 탐색(일반적인 DFS나 BFS)해가면서 모을 수 있는 최대 양을 갱신하려고 했었다.
하지만 위의 방법대로 구현하면 탐색 순서에 따라 모을 수 있는 양의 수가 달라지는 문제점이 있었다.

결정론으로 바꿔서, "해당 그래프가 주어졌을때, 탐색이 가능한가?" 에 대해 해봐도 위와 같은 문제점이 생겼다.

위의 접근법으로 어떻게든 풀려고 예시 그래프에 child node들을 덕지덕지 붙이고 떼었을 때, 다음과 같은 생각을 하게 됬다.

'양을 모을 수 있는 subtree들에서 child node를 구해가면서 답을 구하는건 어떨까?'

그래서 나는 다음과 같이 정의했다.
- tree의 모든 node를 방문했을때 tree속 양들을 모두 모을 수 있는 경우 그 tree는 양과 늑대 탐색이 가능하다고 한다.

양과 늑대 탐색이 가능한 subtree 가 주어졌을 때, subtree에 연결되어있는 child node 중 하나를 연결해 새로운 subtree를 구성하면, 새로운 subtree가 양과 늑대 탐색이 가능한지 확인하고, 이를 계속 반복하면 된다.

n <= 17이여서 subtree의 경우의 수가 30만 미만이기 때문에, 충분히 시간내에 문제를 풀 수 있다.

 

내 코드는 다음과 같다.

from collections import deque

def get_bit(bit, n): return (bit >> n) & 1
def solution(info, edges):
    answer = 0
    n = len(info)
    graph = dict()
    visited = [False] * (1<<(n+1))
    for i in range(n):  graph[i] = []
    for e in edges: graph[e[0]].append(e[1])
    
    c = deque()
    c.append(1)
    visited[1] = True
    
    while len(c):
        a = c.popleft()
        s = w = 0
        for i in range(n):
            if get_bit(a, i):
                if info[i]: w += 1
                else: s += 1
        if w >= s: continue
        answer = answer if answer >= s else s
        
        for i in range(n):
            if get_bit(a, i): 
                for child in graph[i]:
                    n = a | (1<<child)
                    if not visited[n]:
                        visited[n] = True
                        c.append(n)
    return answer

 

 

'알고리즘' 카테고리의 다른 글

KAKAO 2022 파괴되지 않는 건물  (1) 2022.02.04
BOJ 2143 두 배열의 합  (0) 2022.01.26
BOJ 2437 저울  (0) 2022.01.21
2018 KAKAO 자동완성  (0) 2022.01.19
2019 KAKAO 겨울 인턴쉽 호텔 방 배정  (0) 2022.01.18