BOJ 1939 중량 제한

DooDuZ·2024년 6월 11일
0

항해99 취업 리부트

목록 보기
13/14

항해99 취업 리부트 알고리즘 2주차 시험 4번 문제

다익스트라 알고리즘으로 접근해서 풀었는데 제출 후에 이분 탐색으로도 다시 풀어봤다

log2 10억이 30미만 값으로 아주 작은 값일지라도 그 때마다 bfs든 dfs든 탐색이 진행되기 때문에 속도가 느릴줄 알았고, 불필요한 탐색이 발생하지 않는 다익스트라가 훨씬 빠를 거라고 생각했는데 아니었다.

생각해보면 다익스트라의 시간복잡도도 O((V+E) log V)고, bfs를 O(V+E) 이분 탐색을 O(log Weight)라고 하면 그렇게 크게 차이날 일도 아니었다. log V랑 log weight래봤자 어짜피 log 안의 값이니까... log V가 최대 13~14 이고 log weight가 최대 29~30이라면 엄청 차이날 일은 아니었지 싶다.

라고 하기엔 효율이 2배가량 차이 났어야하나. 적어도 BOJ 테스트 케이스에선 차이가 없다고 봐도 무방한 결과가 나왔다. 여하튼...

아래는 이분 탐색 소스코드

# 멘토님 추천 문제
# BOJ 1939 중량 제한
# binary search 사용

import sys
from collections import deque

input = sys.stdin.readline


def get_input():
    params = []

    n, m = list(map(int, input().split()))

    params.append(n)

    edges = [[] for _ in range(n)]

    for _ in range(m):
        a, b, c = list(map(int, input().split()))
        a -= 1
        b -= 1

        edges[a].append([b, c])
        edges[b].append([a, c])

    p1, p2 = list(map(int, input().split()))

    params.append(p1 - 1)
    params.append(p2 - 1)
    params.append(edges)

    return params


def solution(params):
    # p1 출발지 p2 목적지
    n, p1, p2, edges = params

    def bfs(weight):
        q = deque()
        visited = [True for _ in range(n)]

        # 출발지 넣고 시작
        q.append(p1)
        visited[p1] = False

        while q:
            v = q.popleft()

            # 도착점이면 True return
            if v == p2:
                return True

            for edge in edges[v]:
                nv, nw = edge
                # 다리 제한 중량이 현재 무게보다 크거나 같으면 넘어가기
                if visited[nv] and nw >= weight:
                    visited[nv] = False
                    q.append(nv)
        # 도착점 못갔으면 False return
        return False

    def binary_search():
        left = 1
        right = 1_000_000_000

        while left <= right:
            mid = (left + right) // 2

            if bfs(mid):
                left = mid + 1
            else:
                right = mid - 1

        return left

    return binary_search() - 1


print(solution(get_input()))
profile
뇌세포에 CPR중

0개의 댓글