알고리즘/Python 코테

99클럽 코테 스터디 1일차 TIL - 완전 탐색

집 밖은 위험해 2024. 5. 29. 22:41

📎 문제링크

https://school.programmers.co.kr/learn/courses/30/lessons/86971

🤔 문제 이해 및 알고리즘 유형

알고리즘 유형

- 완전 탐색

💡 문제 해결 방법

💻 코드

def solution(n, wires):
    answer = 100
    test = [[wires[i] for i in range(len(wires)) if i != j] for j in range(len(wires))] # 전선 하나씩 끊어보기
    
    for wire in test:
        graph = [[] for _ in range(n)] # 인접 리스트 생성
        visited = [False] * n
        for w in wire:
            graph[w[0]-1].append(w[1]-1) # 노드 양방향으로
            graph[w[1]-1].append(w[0]-1) # 연결 추가
        m = dfs(graph, visited, 0, 1) # 연결된 송전탑 수
        answer = min(answer, abs(n-2*m)) # 일부m과 (전체n - 일부m)으로 나눠짐. |(n-m) - m| = |n - 2*m|
    return answer

def dfs(graph, visited, start, n):
    visited[start] = True # 방문 처리
    for i in graph[start]:
        if not visited[i]:
            n = dfs(graph, visited, i, n+1) # n증가
    return n

✔ 생각해봐야 할 점

 

전선을 끊어서 완전 탐색을 해야 한다는 것까지는 생각했지만 이후 과정을 생각하지 못했다.

과정을 정리해 보자면

1) 전선 하나씩 끊어보기

각 전선을 하나씩 끊어보고, 끊어진 전선으로 인해 두 개의 서브 그래프가 형성한다.

 

2) 그래프 탐색 (DFS)

끊어진 두 개의 서브 그래프를 탐색한다.

 

3) 최소 차이를 계산한다.