220v
젝무의 개발새발
220v
전체 방문자
오늘
어제
  • 분류 전체보기 (255)
    • AI (35)
      • ML, DL 학습 (30)
      • 논문 리뷰 (4)
      • 실습 및 프로젝트 (1)
    • Algorithm (145)
      • LeetCode (13)
      • 프로그래머스 (35)
      • 백준 (96)
      • 알고리즘, 문법 정리 (1)
    • Mobile, Application (17)
      • Flutter (10)
      • iOS, MacOS (7)
    • BackEnd (7)
      • Flask (1)
      • Node.js (5)
      • Spring, JSP..etc (1)
    • Web - FrontEnd (18)
      • JavaScript, JQuery, HTML, C.. (12)
      • React (6)
    • DataBase (1)
      • MySQL (1)
      • Firebase Firestore (0)
      • Supabase (0)
    • Git (1)
    • 기타 툴 및 오류 해결 (3)
    • 강의 (5)
      • Database (3)
      • 암호학 (2)
      • 알고리즘 (0)
    • 후기와 회고 (2)
    • 블로그 꾸미기 (1)
    • 일상과 이것저것 (20)
      • 맛집 (12)
      • 세상사는일 (4)
      • 도서리뷰 (1)
      • 이런저런 생각들 (잡글) (3)

블로그 메뉴

  • 홈
  • 태그
  • 방명록

공지사항

인기 글

태그

  • Mathematics
  • 티스토리챌린지
  • IMPLEMENT
  • bitmasking
  • Prefix Sum
  • simulation
  • REACT
  • Greedy
  • topological sort
  • union-find
  • 위상 정렬
  • Lis
  • implementation
  • 프로그래머스
  • 백준
  • 구현
  • BFS
  • Backtracking
  • Dynamic Programming
  • brute-Force
  • disjoint set
  • top-down
  • two pointer
  • dp
  • 다익스트라
  • Minimum Spanning Tree
  • Priority Queue
  • binary search
  • 오블완
  • dfs

최근 댓글

최근 글

티스토리

hELLO · Designed By 정상우.
220v

젝무의 개발새발

Algorithm/백준

[백준] 1277. 발전소 설치 - Python

2023. 10. 1. 16:42

[Gold IV]

 

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

 

1277번: 발전소 설치

첫 줄에는 발전소의 수 N(1 ≤ N ≤ 1,000)과 현재 남아있는 전선의 수 W(1≤ W ≤ 10,000)가 주어진다. 두 번째 줄에는 제한 길이 M(0.0 < M < 200,000.0)가 주어진다. 다음 N개의 줄에는 1번 발전소부터 N번 발

www.acmicpc.net

 

풀이

우선, N <= 1000 이므로, O(N^2) 의 time complexity인 연산을 하거나, 최적화하지 않은 다익스트라를 돌려도 시간초과가 나지 않는 것을 확인했다.

그래서 우선, N*N 배열로 graph를 초기화하고, 모든 원소에 대해 순회하며 거리를 계산해, M보다 크다면 1e9로, 아니라면 거리를 집어넣도록 했다.

또한 이미 연결된 전선이면 cost가 들지 않으므로, graph의 값을 0으로 계산하였다.

 

이후 다익스트라를 이용해, graph에 남겨진 cost가 1e9인 경우 계산하지 않고 continue.

cost가 존재할 경우 기본 다익스트라 알고리즘대로 계산.

 

from math import sqrt
import heapq

N, W = map(int, input().split())
M = float(input())

v = []
for _ in range(N):
    v.append(list(map(int, input().split())))

def distance(x1, y1, x2, y2):
    return sqrt((x2-x1)**2 + (y2-y1)**2)
    
# graph 초기화
graph = [[1e9]*N for _ in range(N)]
for i in range(N):
    for j in range(N):
        if i==j: continue
        graph[i][j] = distance(v[i][0], v[i][1], v[j][0], v[j][1])
        # M보다 거리가 멀면, max값을 넣음.
        if graph[i][j] > M:
            graph[i][j] = 1e9

# 이미 연결된 전선의 cost(거리)는 0으로
for _ in range(W):
    a, b = map(int, input().split())
    graph[a-1][b-1] = 0
    graph[b-1][a-1] = 0

# 다익스트라    
distance = [1e9]*N
distance[0] = 0

q = []
heapq.heappush(q, (0, 0))   # 0번 node(1번) 부터 start. cost는 0.

while q:
    dist, node = heapq.heappop(q)
    
    # visited 확인
    if distance[node] < dist:
        continue
    
    for i, cost in enumerate(graph[node]):
        if cost == 1e9:    # M보다 큰 거리 or i==j
            continue
        
        newCost = dist + cost
        if newCost < distance[i]:
            distance[i] = newCost
            heapq.heappush(q, (newCost, i))
            
print(int(distance[N-1]*1000))

 

    'Algorithm/백준' 카테고리의 다른 글
    • [백준] 17144. 미세먼지 안녕! - Python
    • [백준] 15846. 퇴사 2 - Python
    • [백준] 2504. 괄호의 값 - Python
    • [백준] 12904. A와 B - Python
    220v
    220v
    DGU CSE 20 / Apple Developer Academy @ POSTECH 2nd Jr.Learner.

    티스토리툴바