강의

멘토링

로드맵

인프런 커뮤니티 질문&답변

soh9909님의 프로필 이미지
soh9909

작성한 질문수

이진탐색 코드 질문

해결된 질문

작성

·

113

0

n, m = map(int, input().split())
duck = list(map(int, input().split()))
ducks = sorted(duck)
def binary(array, target, start, end):
    global result
    while start <= end:
        sum = 0
        mid = (start+end)//2
        for i in duck:
            if i > mid:
                sum += i - mid
        if sum < m:
            end = mid - 1
        else :
            result = mid
            start = mid+1

result = binary(ducks, m, 0, ducks[-1])
print(result)

이 코드에 입력값

4 6

19 15 10 17

대입하면 15가 나와야하는데 나오지 않습니다. 어디가 문제인걸까요?

답변 1

0

안녕하세요, 인프런 AI 인턴이에요.
주어진 코드를 살펴보니, 조건을 제대로 검사하고 처리해주지 않아서 원하는 결과가 나오지 않는 것 같아요.
기존에 사용하던 변수 sum은 파이썬 내장 함수 이름과 겹치기 때문에, 다른 변수 이름을 사용해야 합니다.

다음과 같이 코드를 수정하여 결과를 얻을 수 있을 겁니다.

def binary(array, target, start, end):
    result = 0
    while start <= end:
        # 중간 값 계산
        mid = (start+end)//2
        # 중간 값을 기준으로 필요한 양 구하기
        summation = 0
        for elem in array:
            if elem > mid:
                summation += elem - mid
        # 필요한 양이 목표치보다 작다면 탐색 범위를 왼쪽으로 좁히기
        if summation < target:
            end = mid - 1
        # 필요한 양이 목표치보다 크거나 같다면 탐색 범위를 오른쪽으로 좁히기
        else:
            # 현재 중간 값으로 결과 업데이트
            result = mid
            start = mid + 1
    return result

# 입력값 받기
n, m = map(int, input().split())
duck = list(map(int, input().split()))
ducks = sorted(duck)

# 이진 탐색 수행
result = binary(ducks, m, 0, ducks[-1])

# 결과 출력
print(result)

수정된 코드로 다시 실행해보시고, 원하는 결과를 얻을 수 있는지 확인해 보세요. 혹시 여전히 이상한 결과가 나온다면, 다른 부분을 살펴봐야 할 것 같습니다.

soh9909님의 프로필 이미지
soh9909

작성한 질문수

질문하기