HelloMinchan
처음처럼
HelloMinchan
LinkedIn
전체 방문자
오늘
어제
  • 분류 전체보기 (306)
    • Backend (4)
      • NestJS (1)
      • Express (1)
      • Spring (2)
    • Infrastructure (1)
      • AWS (1)
    • Frontend (1)
      • Next.js (1)
    • Language & Runtime (4)
      • Java (2)
      • Node.js (2)
    • Computer Science (8)
      • Computer Networks (3)
      • Operating Systems (4)
      • OOP (1)
    • 독서 (4)
      • 데이터 중심 애플리케이션 설계 (3)
      • 객체지향의 사실과 오해 (1)
    • 회고 (4)
      • Project (2)
      • Career (2)
    • Deprecated (280)

채널

  • GitHub
  • LinkedIn

최근 글

태그

  • 프로그래밍
  • Database
  • 백준Python
  • 데이터베이스
  • front-end
  • 코딩
  • 프로그래머스Python
  • 백엔드
  • 개발자
  • 프로그래머스
  • programmers
  • Algospot
  • 백준Go
  • 알고스팟
  • 백준C++
  • Baekjoon Online Judge
  • 백준
  • 알고스팟Python
  • 프로그래머스C++
  • back-end

최근 댓글

인기 글

hELLO
HelloMinchan

처음처럼

[Baekjoon Online Judge] 백준 1647번 도시 분할 계획(Python)
Deprecated

[Baekjoon Online Judge] 백준 1647번 도시 분할 계획(Python)

2020. 6. 16. 19:32

© 2020 All Rights Reserved. 주식회사 스타트링크

[Baekjoon Online Judge] 백준 1647번 도시 분할 계획

(Python)

(글쓴날 : 2020.06.16)

 


* Baekjoon Online Judge, 백준 1647번 문제 Python 언어 풀이입니다.

* 소스 코드의 저작권은 글쓴이에게 있습니다.


 

 

백준 1647번 도시 분할 계획


1) 문제

문제 링크 : https://www.acmicpc.net/problem/1647

 

1647번: 도시 분할 계획

첫째 줄에 집의 개수N, 길의 개수M이 주어진다. N은 2이상 100,000이하인 정수이고, M은 1이상 1,000,000이하인 정수이다. 그 다음 줄부터 M줄에 걸쳐 길의 정보가 A B C 세 개의 정수로 주어지는데 A번 집

www.acmicpc.net


2) 풀이 과정

* 시간 복잡도 : O(E log E)

 

N개의 집과 유지비가 드는 M개의 길로 구성된 마을이 주어지고, 해당 마을을 길의 유지비가 최소이지만 같은 마을인 집들은 모두 연결된 두 마을로 분리할 때, 발생하는 최소 유지비를 구하는 문제입니다.

 

저의 경우, 크루스칼 알고리즘을 적용하였고, Python을 사용했습니다.

유지비가 최소가 되도록 하려면 최소 신장 트리를 구해야 하므로 주어지는 정보를 가중치인 길의 유지비에 따라 오름차순으로 정렬한 뒤, 크루스칼 알고리즘을 적용하였습니다.

그 과정 중, 유지비가 최소가 되도록 두 마을로 분리한다는 뜻은, 가장 유지비가 많이 드는 길을 끊는다는 뜻과 동치이므로, 최소 신장 트리의 총 가중치에서 마지막으로 합쳐진 길의 가중치를 제거하여 문제를 해결했습니다.


3) 코드

 

* Python 코드

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
import sys
input = sys.stdin.readline
 
 
def find(target):
    if disjointSet[target] == target:
        return target
    
    disjointSet[target] = find(disjointSet[target])
    return disjointSet[target]
 
 
def union(sv, dv):
    findSV = find(sv)
    findDV = find(dv)
 
    if findSV == findDV:
        return False
 
    if findSV < findDV:
        disjointSet[findDV] = findSV
    else:
        disjointSet[findSV] = findDV
 
    return True
 
 
def kruskal():
    global ans
 
    count = 0
    for w, sv, dv in roads:
        if union(sv, dv):
            if count == N - 2:
                break
            
            ans += w
            
            count += 1
 
 
N, M = map(int, input().split())
 
ans = 0
disjointSet = [x for x in range(N + 1)]
 
roads = []
for _ in range(M):
    A, B, C = map(int, input().split())
 
    roads.append((C, A, B))
    roads.append((C, B, A))
 
roads.sort()
 
kruskal()
 
print(ans)

 

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

'Deprecated' 카테고리의 다른 글

[Baekjoon Online Judge] 백준 2252번 줄 세우기(Python)  (0) 2020.06.16
[Baekjoon Online Judge] 백준 2887번 행성 터널(Python)  (0) 2020.06.16
[programmers] 프로그래머스 124 나라의 숫자(Python)  (0) 2020.06.16
[programmers] 프로그래머스 기능개발(Python)  (0) 2020.06.16
[programmers] 프로그래머스 쇠막대기(Python)  (0) 2020.06.16
    'Deprecated' 카테고리의 다른 글
    • [Baekjoon Online Judge] 백준 2252번 줄 세우기(Python)
    • [Baekjoon Online Judge] 백준 2887번 행성 터널(Python)
    • [programmers] 프로그래머스 124 나라의 숫자(Python)
    • [programmers] 프로그래머스 기능개발(Python)
    HelloMinchan
    HelloMinchan
    Though you should not fear failure, You should do your very best to avoid it.

    티스토리툴바