GitHub ID : soohyun-dev
윤수현의 개발 공간
GitHub ID : soohyun-dev
전체 방문자
오늘
어제
  • 분류 전체보기 (918)
    • 성장기록 (49)
      • 성장기록 (3)
      • 우아한테크코스 (16)
      • 프로젝트 (15)
      • TIL (14)
      • 테오의 스프린트 (1)
    • 프로그래밍언어 (88)
      • C언어 (14)
      • HTML\CSS (12)
      • JavaScript (7)
      • React (23)
      • Python (11)
      • JAVA (14)
      • TypeScript (6)
    • 알고리즘 공부 (736)
      • 코드업 - 파이썬 (108)
      • 백준 - 파이썬 (468)
      • 백준 - 자바스크립트 (125)
      • 프로그래머스 - 파이썬 (1)
      • 프로그래머스 - 자바스크립트 (34)
    • 책 리뷰 (9)
      • 프로그래밍 (3)
      • 독서 (6)
    • 전자기기 (1)
    • 일상, 일기 (18)
    • 기술 세미나 (2)

블로그 메뉴

  • 홈
  • 태그
  • 방명록

공지사항

인기 글

태그

  • 백준
  • javascript
  • 파이썬
  • 영어
  • PYTHON
  • 코테
  • 프로그래머스
  • 독해
  • 코딩테스트
  • 프론트엔드
  • 자바스크립트
  • 프로그래머스풀이
  • 코드업
  • 영어독해
  • 프로그래밍언어
  • 코드업파이썬
  • 프로그래머스자바스크립트
  • 백준파이썬
  • 코딩
  • 백준풀이

최근 댓글

최근 글

티스토리

hELLO · Designed By 정상우.
GitHub ID : soohyun-dev

윤수현의 개발 공간

백준/ Platinum 5 문제 , 백준 파이썬 2887, 행성 터널 [최소 스패닝 트리, 프림 알고리즘]
알고리즘 공부/백준 - 파이썬

백준/ Platinum 5 문제 , 백준 파이썬 2887, 행성 터널 [최소 스패닝 트리, 프림 알고리즘]

2022. 8. 22. 14:42

백준/ Platinum 5 문제 , 백준 파이썬 2887, 행성 터널 [최소 스패닝 트리, 프림 알고리즘]

 

 

 

풀이 시간

 

 

Check Point !   ( 해당사항 ✓체크 )

1. 막힘 없이 수월하게 풀린 문제인가?

2. 1시간이내로 풀렸던 문제인가?

3. 1시간 이상 or 며칠을 두고 풀어봤더니 풀린 문제인가?

4. 시간을 써도 도무지 풀 수 없는 문제인가?

5. 솔루션을 찾아봤는가?

-------------------------------------------------------------------------------------------
난이도 체감
1. 최상
2. 상
3. 중
4. 하


<이해도>
1. 완벽히 이해
2. 다소 헷갈리는 부분들이 있음
3. 이해 못함


<덧붙일 말>
기본 프림 알고리즘으로는 시간 복잡도가 O(N^2) 가 발생하여 메모리 초과가 났다.
저장할 간선의 갯수를 줄이는 것이 관건인데, 좌표들을 x,y,z 오름차순으로 각각 세번 나누어서 정렬하여  인접한 노드들끼리의 간선들 가중치를 확인한다. 인접한다는 것은 문제에서 요구하는 최소의 가중치를 가질 확률이 높으므로 배열에 저장해두고 이것들만 가지고도 최소 신장트리를 만들수 있다. 이렇게 할때 시간 복잡도는 O(3*N) 으로 이전보다 확 줄게되어 메모리 초과가 발생하지 않는다.

 

 

 

문제 출처

https://www.acmicpc.net/problem/2887

 

2887번: 행성 터널

첫째 줄에 행성의 개수 N이 주어진다. (1 ≤ N ≤ 100,000) 다음 N개 줄에는 각 행성의 x, y, z좌표가 주어진다. 좌표는 -109보다 크거나 같고, 109보다 작거나 같은 정수이다. 한 위치에 행성이 두 개 이

www.acmicpc.net

 

 

 

풀이

 

 

각각 x / y / z 를 기준으로 오름 차순 정렬을 한다.

 

이후 N-1 개의 인접 간선들을 graph 배열에 양방향으로 저장한다.

 

이 저장된 값들 중에서도 이제 최소 가중치를 가진 것들을 우선적으로 이어 전체 경로를 설정한다.

 

 

 

 

 

정답

 

 

import heapq
import sys
input=sys.stdin.readline

N=int(input())
planets=[[] for _ in range(N+1)]
for i in range(1,N+1):
    planets[i]=list(map(int,input().split()))
    planets[i]+=[i]
planets[0]=[sys.maxsize,sys.maxsize,sys.maxsize,0]
    
visited=[True,True]+[False]*(N-1)
graph=[[] for _ in range(N+1)]

for i in range(3):
    planets.sort(key=lambda x:x[i])
    for j in range(1,N):
        a,b,c,d=planets[j-1]
        A,B,C,D=planets[j]
        graph[d].append((min(abs(a-A),abs(b-B),abs(c-C)),D))
        graph[D].append((min(abs(a-A),abs(b-B),abs(c-C)),d))
    
q=graph[1]
heapq.heapify(q)
result=0

while q:
    Z,X=heapq.heappop(q)
    if not visited[X]:
        result+=Z
        visited[X]=True
        for i in graph[X]:
            if not visited[i[1]]:
                heapq.heappush(q,i)

print(result)

 

반응형

'알고리즘 공부 > 백준 - 파이썬' 카테고리의 다른 글

백준/ Gold 4 문제 , 백준 파이썬 14621 , 나만 안되는 연애 [최소 스패닝 트리]  (0) 2022.08.22
백준/ Gold 4 문제 , 백준 파이썬 16398 , 행성 연결 [최소 스패닝 트리]  (0) 2022.08.22
백준/ Gold 4 문제 , 백준 파이썬 4386 , 별자리 만들기 [최소 스패닝 트리, 프림 알고리즘]  (0) 2022.08.22
백준/ Gold 4 문제 , 백준 파이썬 1647 , 도시 분할 계획 [최소 스패닝 트리]  (0) 2022.08.22
백준/ Gold 4 문제 , 백준 파이썬 1922 , 네트워크 연결 [최소 스패닝 트리]  (0) 2022.08.21
    '알고리즘 공부/백준 - 파이썬' 카테고리의 다른 글
    • 백준/ Gold 4 문제 , 백준 파이썬 14621 , 나만 안되는 연애 [최소 스패닝 트리]
    • 백준/ Gold 4 문제 , 백준 파이썬 16398 , 행성 연결 [최소 스패닝 트리]
    • 백준/ Gold 4 문제 , 백준 파이썬 4386 , 별자리 만들기 [최소 스패닝 트리, 프림 알고리즘]
    • 백준/ Gold 4 문제 , 백준 파이썬 1647 , 도시 분할 계획 [최소 스패닝 트리]
    GitHub ID : soohyun-dev
    GitHub ID : soohyun-dev
    환영합니다!😊 이곳은 저의 개발에 관한 내용들을 정리하는 공간입니다. 알고리즘 풀이에도 관심이 많아요. 좋은 하루 되세요~! github : soohyun_dev

    티스토리툴바