알고리즘
[문제 풀이] 10월 30일
스히
2023. 10. 30. 17:37
< 나무 자르기 > - 백준 2805
1. 시간 초과
import sys
input = sys.stdin.readline
n, m = map(int, input().split())
trees = list(map(int, input().split()))
start = max(trees)
while start > 0:
sums = 0
start -= 1
for tree in trees:
if int(tree) > start:
len = int(tree) - start
sums += len
if sums >= m:
print(start)
break
2. 정답 코드
import sys
input = sys.stdin.readline
n, m = map(int, input().split())
trees = list(map(int, input().split()))
start, end = 1, max(trees)
while start <= end:
mid = (start + end) // 2
sums = 0
for tree in trees:
if tree > mid:
sums += (tree - mid)
if sums >= m:
start = mid + 1
else:
end = mid - 1
print(end)
< 수 찾기 > - 백준 1920
import sys
input = sys.stdin.readline
n = int(input())
n_nums = list(map(int, input().split()))
n_nums.sort()
m = int(input())
m_nums = list(map(int, input().split()))
for num in m_nums:
start = 0
end = n - 1
inlist = False
while start <= end:
mid = (start + end) // 2
if num == n_nums[mid]:
inlist = True
print(1)
break
elif num < n_nums[mid]:
end = mid - 1
elif num > n_nums[mid]:
start = mid + 1
if inlist == False:
print(0)
< 공유기 설치 > - 백준 2110
- 공유기 개수 조건을 어떻게 생각해내지,,,
- 이해하는 데 오래 걸렸다
import sys
input = sys.stdin.readline
n, c = map(int,input().split())
houses = [int(input()) for i in range(n)]
houses.sort() # [1, 2, 4, 8, 9]
start = 1 # 집 사이의 최소 거리
end = houses[n-1] - houses[0] # 집 사이의 최대 거리
result = 0
if c == 2:
print(houses[n-1] - houses[0])
else:
while start <= end:
mid = (start + end) //2
count = 1
cur = houses[0]
for house in houses: # 공유기 설치 몇개 가능한가
if house - cur >= mid:
count += 1
cur = house
if count >= c: # 설치 가능한 공유기 수가 c보다 크면 거리를 늘려야 하고
result = mid
start = mid + 1
elif count < c: # 설치 가능한 공유기 수가 c보다 작으면 거리를 좁혀야 함
end = mid - 1
print(result)