1939번: 중량제한
첫째 줄에 N, M(1 ≤ M ≤ 100,000)이 주어진다. 다음 M개의 줄에는 다리에 대한 정보를 나타내는 세 정수 A, B(1 ≤ A, B ≤ N), C(1 ≤ C ≤ 1,000,000,000)가 주어진다. 이는 A번 섬과 B번 섬 사이에 중량제한이
www.acmicpc.net
문제
N(2 ≤ N ≤ 10,000)개의 섬으로 이루어진 나라가 있다. 이들 중 몇 개의 섬 사이에는 다리가 설치되어 있어서 차들이 다닐 수 있다.
영식 중공업에서는 두 개의 섬에 공장을 세워 두고 물품을 생산하는 일을 하고 있다. 물품을 생산하다 보면 공장에서 다른 공장으로 생산 중이던 물품을 수송해야 할 일이 생기곤 한다. 그런데 각각의 다리마다 중량제한이 있기 때문에 무턱대고 물품을 옮길 순 없다. 만약 중량제한을 초과하는 양의 물품이 다리를 지나게 되면 다리가 무너지게 된다.
한 번의 이동에서 옮길 수 있는 물품들의 중량의 최댓값을 구하는 프로그램을 작성하시오.
입력
첫째 줄에 N, M(1 ≤ M ≤ 100,000)이 주어진다. 다음 M개의 줄에는 다리에 대한 정보를 나타내는 세 정수 A, B(1 ≤ A, B ≤ N), C(1 ≤ C ≤ 1,000,000,000)가 주어진다. 이는 A번 섬과 B번 섬 사이에 중량제한이 C인 다리가 존재한다는 의미이다. 서로 같은 두 섬 사이에 여러 개의 다리가 있을 수도 있으며, 모든 다리는 양방향이다. 마지막 줄에는 공장이 위치해 있는 섬의 번호를 나타내는 서로 다른 두 정수가 주어진다. 공장이 있는 두 섬을 연결하는 경로는 항상 존재하는 데이터만 입력으로 주어진다.
출력
첫째 줄에 답을 출력한다.
코드
import sys
input = sys.stdin.readline
from collections import deque
n, m = map(int, input().split())
# 다리 정보 입력
bridge = [[] for _ in range(n+1)]
for _ in range(m):
a, b, c = map(int, input().split())
bridge[a].append([b, c])
bridge[b].append([a, c])
# 공장이 위치한 섬들
island1, island2 = map(int, input().split())
def bfs(weight): # weight : 옮기는 물품들의 중량
q = deque([island1])
visited = [False] * (n+1)
visited[island1] = True
while q:
now = q.popleft()
if now == island2:
return True
for next, w in bridge[now]: # 다음 섬, 중량제한
if not visited[next] and w >= weight:
visited[next] = True
q.append(next)
return False
# 이분탐색
start, end = 1, int(1e9)
ans = 0
while start <= end:
mid = (start + end) // 2
if bfs(mid): # 옮기는 물건들의 중량이 mid일 때 이동이 가능한지?
ans = mid
start = mid + 1
else:
end = mid - 1
print(ans)
매개 변수 탐색을 통해 옮길 수 있는 무게의 최댓값을 구한다. start와 end는 입력으로 주어질 수 있는 무게의 최솟값(1)과 최댓값(1,000,000,000)으로 초기값을 설정한다. mid 값이 옮기는 물건의 중량이라고 할 때 bfs() 함수를 이용하여 mid 값일 때 시작섬에서 도착섬까지 도달 가능 여부를 알아본다. 도달이 가능하다면 ans는 mid로, start는 mid+1로 갱신하여 더 큰 값에 대해 가능한지 알아본다.
'문제풀이 > 이분탐색' 카테고리의 다른 글
[Python/파이썬] 백준 18114번 블랙 프라이데이 (0) | 2023.07.05 |
---|---|
[Python/파이썬] 백준 17951번 흩날리는 시험지 속에서 내 평점이 느껴진거야 (0) | 2023.06.29 |
[Python/파이썬] 백준 2118번 두 개의 탑 (0) | 2023.06.08 |
[Python/파이썬] 백준 1477번 휴게소 세우기 (0) | 2023.05.03 |
[Python/파이썬] 백준 20444번 색종이와 가위 (0) | 2023.05.02 |
1939번: 중량제한
첫째 줄에 N, M(1 ≤ M ≤ 100,000)이 주어진다. 다음 M개의 줄에는 다리에 대한 정보를 나타내는 세 정수 A, B(1 ≤ A, B ≤ N), C(1 ≤ C ≤ 1,000,000,000)가 주어진다. 이는 A번 섬과 B번 섬 사이에 중량제한이
www.acmicpc.net
문제
N(2 ≤ N ≤ 10,000)개의 섬으로 이루어진 나라가 있다. 이들 중 몇 개의 섬 사이에는 다리가 설치되어 있어서 차들이 다닐 수 있다.
영식 중공업에서는 두 개의 섬에 공장을 세워 두고 물품을 생산하는 일을 하고 있다. 물품을 생산하다 보면 공장에서 다른 공장으로 생산 중이던 물품을 수송해야 할 일이 생기곤 한다. 그런데 각각의 다리마다 중량제한이 있기 때문에 무턱대고 물품을 옮길 순 없다. 만약 중량제한을 초과하는 양의 물품이 다리를 지나게 되면 다리가 무너지게 된다.
한 번의 이동에서 옮길 수 있는 물품들의 중량의 최댓값을 구하는 프로그램을 작성하시오.
입력
첫째 줄에 N, M(1 ≤ M ≤ 100,000)이 주어진다. 다음 M개의 줄에는 다리에 대한 정보를 나타내는 세 정수 A, B(1 ≤ A, B ≤ N), C(1 ≤ C ≤ 1,000,000,000)가 주어진다. 이는 A번 섬과 B번 섬 사이에 중량제한이 C인 다리가 존재한다는 의미이다. 서로 같은 두 섬 사이에 여러 개의 다리가 있을 수도 있으며, 모든 다리는 양방향이다. 마지막 줄에는 공장이 위치해 있는 섬의 번호를 나타내는 서로 다른 두 정수가 주어진다. 공장이 있는 두 섬을 연결하는 경로는 항상 존재하는 데이터만 입력으로 주어진다.
출력
첫째 줄에 답을 출력한다.
코드
import sys input = sys.stdin.readline from collections import deque n, m = map(int, input().split()) # 다리 정보 입력 bridge = [[] for _ in range(n+1)] for _ in range(m): a, b, c = map(int, input().split()) bridge[a].append([b, c]) bridge[b].append([a, c]) # 공장이 위치한 섬들 island1, island2 = map(int, input().split()) def bfs(weight): # weight : 옮기는 물품들의 중량 q = deque([island1]) visited = [False] * (n+1) visited[island1] = True while q: now = q.popleft() if now == island2: return True for next, w in bridge[now]: # 다음 섬, 중량제한 if not visited[next] and w >= weight: visited[next] = True q.append(next) return False # 이분탐색 start, end = 1, int(1e9) ans = 0 while start <= end: mid = (start + end) // 2 if bfs(mid): # 옮기는 물건들의 중량이 mid일 때 이동이 가능한지? ans = mid start = mid + 1 else: end = mid - 1 print(ans)
매개 변수 탐색을 통해 옮길 수 있는 무게의 최댓값을 구한다. start와 end는 입력으로 주어질 수 있는 무게의 최솟값(1)과 최댓값(1,000,000,000)으로 초기값을 설정한다. mid 값이 옮기는 물건의 중량이라고 할 때 bfs() 함수를 이용하여 mid 값일 때 시작섬에서 도착섬까지 도달 가능 여부를 알아본다. 도달이 가능하다면 ans는 mid로, start는 mid+1로 갱신하여 더 큰 값에 대해 가능한지 알아본다.
'문제풀이 > 이분탐색' 카테고리의 다른 글
[Python/파이썬] 백준 18114번 블랙 프라이데이 (0) | 2023.07.05 |
---|---|
[Python/파이썬] 백준 17951번 흩날리는 시험지 속에서 내 평점이 느껴진거야 (0) | 2023.06.29 |
[Python/파이썬] 백준 2118번 두 개의 탑 (0) | 2023.06.08 |
[Python/파이썬] 백준 1477번 휴게소 세우기 (0) | 2023.05.03 |
[Python/파이썬] 백준 20444번 색종이와 가위 (0) | 2023.05.02 |