728x90
이분탐색 !
시간 복잡도 : O(log n)
무조건 정렬이 되어있어야한다.
start와 end 라는 포인터 변수를 만든다 .
mid 라는 중간 지점 변수를 만들어서 (start + end ) // 2 로 설정한다.
이분탐색 코드 :
if __name__=="__main__" :
n,m = map(int,input().split())
num = list(map(int,input().split()))
num.sort()
start,end = 0,n-1
while start <= end :
mid = (start + end) // 2
# 내가 찾으려는 숫자인가..?
if num[mid] == m :
print(mid+1)
break
# 내가 찾으려는 숫자보다 작다
elif num[mid] < m :
start = mid + 1
# 내가 찾으려는 숫자보다 크다
else :
end = mid -1
랜선자르기 코드 :
if __name__=="__main__" :
k,n = map(int,input().split())
num = list(int(input()) for _ in range(k))
answer = 0
start,end = 1,max(num)
while start <= end :
mid = (end+ start) //2
ans = 0
for i in num :
ans += (i // mid)
if ans >=n :
answer = max(answer,mid)
start = mid +1
else :
end = mid -1
print(answer )
뮤직비디오 코드 :
def Count(capacity) :
# cd의 개수
cnt = 1
sum = 0
for x in music :
if sum + x > capacity :
# cd 추가
cnt +=1
sum = x
else : sum += x
return cnt
if __name__=="__main__" :
n,m = map(int,input().split())
music = list(map(int,input().split()))
longMusic = max(music)
start,end = 1,sum(music)
ans = 0
while start <= end :
mid = (start+end)//2
# cd의 개수가 m보다 작거나 같다면
# 가장 긴 노래보다는 DVD용량이 크거나 같아야한다.
if mid >= longMusic and Count(mid) <=m :
ans = mid
# 용량을 더 줄인다.
end = mid -1
else :
start = mid +1
print(ans)
마구간 정하기 코드 :
def Count(len) :
cnt = 1
ep = line[0]
for i in range(1,n) :
if line[i] -ep >= len :
cnt +=1
ep = line[i]
return cnt
if __name__=="__main__" :
n,c = map(int,input().split())
line = [int(input()) for _ in range(n)]
line.sort()
start, end = 1, line[-1]
while start <= end :
mid = (start + end) //2
if Count(mid) >= c :
res = mid
start = mid +1
else :
end = mid -1
print(res)
반응형
'스터디 > 알고리즘스터디-알까기🎯' 카테고리의 다른 글
완전탐색_바둑이 승차_cut edge 방법,DFS 시간초과를 방지하는 법 (0) | 2022.09.19 |
---|---|
그리디_회의실 배정, 씨름선수, 창고 정리, 침몰하는 타이타닉, 증가순열만들기, 역수열 (0) | 2022.09.03 |
냅색 알고리즘 _ 가방문제, 동전교환, 최대 점수 구하기 (0) | 2022.09.02 |
[7]알고리즘스터디 - 섹션7_3주차 스터디 (0) | 2022.02.28 |
[6]알고리즘스터디 - 섹션6_3주차 스터디 (0) | 2022.02.28 |