틀린 코드

k, n = map(int,input().split())
a = []
for _ in range(k):
    a.append(int(input()))
num = sum(a)//n

while True:
    ans=0
    for i in range(k):
        ans += a[i]//num
    if ans==n:
        print(num)
        break
    num -= 1

답은 맞았지만 시간초과.

 


코드

k, n = map(int,input().split())

def Count(len): # 길이를 변수로 받아서
    cnt = 0
    for i in line:
        cnt+=(i//len)
    return cnt

line = []
ans = 0
largest = 0 # 랜선 중 가장 긴 값

for i in range(k):
    tmp = int(input())
    line.append(tmp)
    largest = max(largest, tmp) # 기존의 값과 새로운 값 비교

lt = 1
rt = largest

while lt <= rt:
    mid=(lt+rt)//2 # mid = 답이되는 랜선의 길이
    if Count(mid)>=n: # mid로 만들 수 있는 랜선의 수
        ans=mid
        lt = mid+1
    else:
        rt = mid-1

print(ans)

이분탐색으로 접근해야 시간 초과 없이 문제를 풀 수 있다.

 

첫 풀이와 다르게,

랜선의 길이를 '0', '최대 랜선 길이' 로 따로 변수를 지정해서 저장해주었고

 

최소 랜선 길이가 최대 랜선 길이와 같거나 작을 때까지 반복하여

이분 탐색을 통해 답이 되는 랜선의 길이를 찾았다.

 

확실히 이분탐색으로 탐색을 해야 시간복잡도가 줄어드는 것 같다.

'⏰ 코딩테스트 > 그리디' 카테고리의 다른 글

씨름 선수  (0) 2021.10.08
백준 알고리즘 - 1931 - 회의실 배정  (0) 2021.10.07
마구간 정하기(결정알고리즘)  (0) 2021.10.06
뮤직비디오(결정알고리즘)  (0) 2021.10.05
이분 검색  (0) 2021.10.03
복사했습니다!