- 문제 : https://school.programmers.co.kr/learn/courses/30/lessons/86971
Lv2 문제다!
주어진 그래프에서 연결 하나를 없앤 후 두개이 서브 그래프 노드 수의 최솟값을 구하는 문제라고 이해했다
그래프 만들고, 노드 수 세는 건 할 수 있는데 연결 하나를 어떻게 없애는지 몰랐다
풀이 로직
- 주어진 간선 정보와 for문으로 그래프를 만든다
- 그래프의 노드 하나씩을 탐색하면서 i번째 노드와 연결된 graph[i][j]를 없앤 후 i번째 노드에 연결된 다른 노드가 있다면
- connect() 함수를 이용해 해당 그래프를 탐색한다
- connect() 함수 : 주어진 노드를 중심으로 연결된 노드들을 찾아 해당 visit 값을 1로 설정한 후 visit 배열을 반화난다
- visit값이 1인 노드들은 해당 그래프에 속하므로 visit에서 1의 갯수와 0의 갯수 차이를 구하면 두 그래프의 노드 수 차이를 알 수 있다
- 위의 과정을 반복하며 노드 수 차이의 최솟값(min_num)을 구한 후 반환한다
- 정답 풀이 :
def connect(arr, i, graph):
stack = []
for i in arr:
stack.append(i)
visit = [0] * (len(graph) + 1)
visit[0], visit[i] = 1, 1
while stack:
a = stack.pop()
for i in graph[a]:
if not visit[i]:
stack.append(i)
visit[i] = 1
return visit
def solution(n, wires):
graph = [[] for _ in range(n + 1)]
for wire in wires:
graph[wire[0]].append(wire[1])
graph[wire[1]].append(wire[0])
min_num = 100
for i in range(1, n + 1):
for j in range(len(graph[i])):
temp = graph[i][j]
graph[i].remove(graph[i][j])
if graph[i]:
result = connect(graph[i], i, graph)
min_num = min(min_num, abs(result.count(0) - result.count(1)))
graph[i] = [temp] + graph[i]
return min_num
'프로그래머스 > Level 2' 카테고리의 다른 글
[탐욕법 / 프로그래머스] 42860번 : 조이스틱 (0) | 2022.10.28 |
---|---|
[연습문제 / 프로그래머스] 132265번 : 롤케이크 자르기 (0) | 2022.10.25 |
[탐욕법 / 프로그래머스] 42883번 : 큰 수 만들기 (1) | 2022.10.13 |
[스택, 큐 / 프로그래머스] 42583번 : 다리를 지나는 트럭 (0) | 2022.10.05 |
[완전탐색 / 프로그래머스] 42839번 : 소수찾기 (0) | 2022.10.05 |