deo2kim
맞왜틀
deo2kim
전체 방문자
오늘
어제
  • 분류 전체보기
    • CS
      • Algorithm
      • Data Structure
      • Network
      • DB
      • OS
    • Algorithm Problem
      • Python
      • JavaScript
    • Programming language
      • Python
      • JavaScript
    • Tool
      • Jquery
      • React
    • 개발
    • Infra

블로그 메뉴

  • 홈
  • 태그
  • 방명록

공지사항

인기 글

최근 댓글

최근 글

티스토리

반응형
hELLO · Designed By 정상우.
deo2kim

맞왜틀

[python] 백준 - 1922. 네트워크 연결
Algorithm Problem/Python

[python] 백준 - 1922. 네트워크 연결

2020. 5. 22. 22:48
반응형

문제 해결

1. 오늘 배운 최소 신장 트리(MST)를 사용하는 그래프 문제다. ( + heapq 모듈 사용 )

💨 그래프에서 사이클을 제거하고 모든 노드를 포함하는 트리를 구성할 때, 가중치의 합이 최소가 되도록 만든 경우를 최소신장트리라고 한다.

 (1) 먼저 간선과 가중치를 인접리스트로 만든다.

 (2) key, mst, pq | 최소 가중치를 갱신하는 배열, 방문 배열, 힙큐( 최소값을 뽑는 모듈 )

2. 시작점( 노드중 아무거나 )을 힙큐에 넣어주고 시작 - 이 문제에서는 모든 노드를 연결할 수 있다.

 (1) 힙큐 안에서 가중치가 가장 낮은 정점을 pop

 (2) 방문했는지 확인 | 이미 방문을 했다면 continue 를 통해 힙큐에서 다시 뽑고, 아니라면 True로 바꿔주고 가중치를 결과에 더해준다.

 (3) 인접리스트를 통해 현재 정점에서 갈 수 있으며 아직방문을 안했고, 가중치가 현재 key배열에 있는 가중치보다 작으면 key값을 갱신하고, 힙큐에 넣어준다.

 

-> 인접행렬을 사용했다. - 시간초과 - 인접리스트 사용

처음 시작 노드마다 값이 다른줄 알고 for문을 통해 모든 노드를 시작점으로 돌려줬다. - 시간초과

 

+ 자주 나오는 개념은 아니지만 알아두면 좋을 것 같다. 

처음 배운 개념이라 배운 코드와 내용이 다르면 잘 이해가 가지 않는다.

근데 다른코드가 효율이 더 좋아보인다.....😭

 

소스 코드

import heapq
n,  m = int(input()), int(input())

# 인접리스트
adj = {i: [] for i in range(n)}
for _ in range(m):
    s, e, c = map(int, input().split())
    adj[s-1].append([e-1, c])
    adj[e-1].append([s-1, c])

# key : 가장 큰 값들로 채움(최소값을 이용할 것이기 때문) | key는 인덱스번호인 정점에서 갈 수 있는 최소 가중치
# mst : visit과 비슷한 개념
# pq : 힙큐 모듈 사용 - heapq.heappop 사용시 최소값이 나온다. - 시간복잡도 good
key = [float('inf')] * n
mst = [False] * n
pq = []

# 시작 점을 정해주고 | 여기서는 아무 정점이나 정해준다. 시작점에서 시작점으로 가는 key 는 0
key[0] = 0
heapq.heappush(pq, (0, 0))
result = 0

while pq:
    k, u = heapq.heappop(pq)  # 가중치가 최소인 정점을 뽑아주고

    if mst[u]:  # 힙큐에 이미 방문한 정점도 포함되어 있으므로, 이미 방문한 정점이 나오면 스킵!
        continue

    mst[u] = True  # 잘뽑았으면 방문 표시
    result += k  # 결과에 가중치를 더해준다.

    for dest, w in adj[u]:  # u 에서 갈 수 있는 곳을 찾아
        if not mst[dest] and w < key[dest]:  # 아직방문하지 않은 곳이면서 key에 저장된 가중치보다 작은 값이라면
            key[dest] = w  # key값을 갱신
            heapq.heappush(pq, (key[dest], dest))  # 힙큐에 다음 목적지를 저장

print(result)

 

출처 : BACKJOON ONLINE JUDGE

문제 : https://www.acmicpc.net/problem/1922

 

1922번: 네트워크 연결

이 경우에 1-3, 2-3, 3-4, 4-5, 4-6을 연결하면 주어진 output이 나오게 된다.

www.acmicpc.net

 

반응형
저작자표시 비영리 변경금지 (새창열림)

'Algorithm Problem > Python' 카테고리의 다른 글

[python] 백준 - 1759. 암호 만들기  (0) 2020.05.27
[python] 백준 - 7568. 덩치  (0) 2020.05.25
[python] 백준 - 2644. 촌수계산  (0) 2020.05.21
[python] 백준 - 17142. 연구소 3 (삼성 SW 역량 테스트 기출 문제)  (0) 2020.05.20
[python] 백준 - 14499. 주사위 굴리기(삼성 SW 역량 테스트 기출 문제)  (0) 2020.05.19
    'Algorithm Problem/Python' 카테고리의 다른 글
    • [python] 백준 - 1759. 암호 만들기
    • [python] 백준 - 7568. 덩치
    • [python] 백준 - 2644. 촌수계산
    • [python] 백준 - 17142. 연구소 3 (삼성 SW 역량 테스트 기출 문제)
    deo2kim
    deo2kim
    코딩 기록하기

    티스토리툴바