알고리즘/프로그래머스

[위클리 챌린지] 9주차

래울 2021. 10. 5. 20:35

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

 

코딩테스트 연습 - 9주차

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

programmers.co.kr

 

그래프 탐색 문제..?

 

아무튼 뭐 트리 그래프의 간선을 하나 지워서 두개의 트리를 만들때, 정점이 개수의 차의 최소값을 구하면된다.

 

 

 

- 풀이

1. 일단 어떤 간선을 지우는 것이 답인지 모르니까, 하나의 간선을 지운 graph를 만든다.

2. search함수에 graph와, 시작점(삭제한 간선의 정점 중 하나)를 인자로 넘겨준다.

3. stack을 시작점으로 초기화, 스택이 비어있을때(=더이상 탐색할 곳이 없을 때)까지 반복

4. 스택의 맨앞의 원소를 뽑아 탐색시작

EX ) n = 9    ,    wires = [[1,3],[2,3],[3,4],[4,5],[4,6],[4,7],[7,8],[7,9]]
에서 graph = [[1, 3], [2, 3], [3, 4], [4, 5], [4, 6], [7, 8], [7, 9]] 이고, wires[i] = [4, 7]이면
g stack now(=stack[0])
[[1, 3], [2, 3], [3, 4], [4, 5], [4, 6], [7, 8], [7, 9]] [4] 4
[[1, 3], [2, 3], [7, 8], [7, 9]] [5, 6] 3
[[7, 8], [7, 9]] [5, 6, 1, 2] 5
[[7, 8], [7, 9]] [6, 1, 2] 6
[[7, 8], [7, 9]] [1, 2] 1
[[7, 8], [7, 9]] [2] 2

5. 두 트리의 정점의 개수의 차만 알면 되므로, 길이의 차에 대해 절대값을 취하고, answer추가

6. answer중 최소값 반환

 

 

 

- 코드

def solution(n, wires):
    answer = []
    graph = []
    for i in range(len(wires)):
        graph = [w for w in wires if not w==wires[i]]
        answer.append(abs(search(graph[:], wires[i][0]) - search(graph[:], wires[i][1])))
    return min(answer)

def search(g, s):
    stack = [s]
    while stack:
        now = stack.pop(0)
        for i in g[:]:
            if i[0] == now:
                stack.append(i[1])
                g.remove([i[0], i[1]])
            elif i[1] == now:
                stack.append(i[0])
                g.remove([i[0], i[1]])
    return len(g)