반응형
Notice
Recent Posts
Recent Comments
Link
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 |
Tags
- kafka 설치
- 빌드도구
- 문맥교환
- 프로그래머스
- freenom
- 데이터베이스복사
- Catalyst Optimizer
- 데이터 수집
- 지연연산
- Spark 최적화
- 실행엔진
- ORACLE문법
- Spark
- lazy evaluation
- 하둡에코시스템
- 데이터파이프라인
- 스파크
- 하둡2.0
- EMR 구조
- 런타임데이터영역
- 데이터엔지니어링
- 카프카
- 프로그래머스 큰 수 만들기
- ORACLE MSSQL차이
- 프로그래머스힙
- AWS Crawler
- 서버간 복사
- 하둡
- 하둡1.0
- Databricks
Archives
- Today
- Total
띵유로그
[프로그래머스][그리디] 섬 연결하기 본문
반응형
def getParent(idx):#제일 부모를 반환
if idx==parent[idx]:
return idx
else :return getParent(parent[idx])
def union(f,s):
f=getParent(f)
s=getParent(s)
if f<s:
parent[s]=getParent(f)#최상위 부모로 지정해줘야함***
else :
parent[f]=getParent(s)
def solution(n, costs):
answer = 0
global parent#초기의 부모는 자기 자신
parent=[i for i in range(n)]#초기의 부모는 자기 자신
#cost기준으로 정렬
sorted_costs=sorted(costs,key= lambda x : x[2])
for i in sorted_costs:
#cost작은거부터 조회하면서 간선 연결 (parent를 union)
# print(i[0], getParent(i[0]), i[1],getParent(i[1]))
if getParent(i[0])!=getParent(i[1]):#(사이클이 없을 때) parent[i[0]]!=parent[i[1]]로 조회하면 안됨
union(i[0], i[1])
answer+=i[2]
print(parent)
#연결할 때 cycle 이 있는지 확인해야함
return answer
최소 신장트리를 만들면 되는 문제이다.
(크루스칼 알고리즘)
헷갈렸던것
1. union함수에서 지금 연결하는 노드의 부모만 갱신해주면 안됨!
-> 지금 연결하는 노드가 다른것과도 연결되어있을 수 있으므로, 지금 연결하려는 노드의 제일 상위 부모를 찾아 부모의 부모를 갱신해줘야함
2. 사이클이 있는지 확인할 때 : parent 배열(부모배열)만 조회하면 될 것이라고 생각했으나 ㄴㄴ
-> 1번과정에 의해 갱신될 때 제일 상위의 부모의 부모만 바뀌게 되므로 사이에 있던 parent 배열만 보면 사이에있는 노드들은 부모의 부모가 생겼으나 그 사실을 모른채 자신의 부모를 parent 배열에 담고있음. 즉, parent 배열이 최상위 부모를 뜻하는 것은 아님. 따라서 getparent 함수를 통해서 최상위 부모를 가져와야함.
그게 아니면 parent 배열을 만들 때 최상위 부모를 적재하자...
반응형
'알고리즘' 카테고리의 다른 글
[해커랭크] Time Conversion (0) | 2021.01.25 |
---|---|
[프로그래머스][DP] N으로 표현 (0) | 2020.12.15 |
[프로그래머스][그리디]큰 수 만들기 (0) | 2020.09.15 |
[프로그래머스][완전탐색]카펫 (0) | 2020.09.09 |
[프로그래머스][완전탐색]소수탐색 (0) | 2020.09.07 |
Comments