티스토리 뷰

알고리즘/Programmers

[프로그래머스] 예산

개발하는 후딘 2020. 4. 20. 20:53
728x90
반응형

https://programmers.co.kr/learn/courses/30/lessons/43237?language=python3

 

프로그래머스

코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.

programmers.co.kr


[풀이]

 

이진탐색의 틀만 안다면 풀 수 있다.

budgets=[ 120, 110, 140 , 150] 의 예를 든다면

 

(1) 먼저 budget을 오름차순 정렬시킨다.

 

(2) left=0 , right=budgets[-1]=150 으로 초기화 한다.

 

(3) 여기서 두가지 경우가 나올 수 있다.

(3-1) M>=[상한액이 right일때 요청금액]

예시에서 right=150이므로

상한액이 150일때 요청금액은 110+120+140+150=520 이다.

즉 right일때의 요청금액은 sum(budgets)와 같다.

따라서 M>=sum(budget)의 경우를 만족한다면 budget중 가장 큰값을 리턴한다.

 

(3-2) M<[상한액이 right일때 요청금액]

여기서는 이분탐색을 활용한다.

left와 mid가 같을때까지 while-loop을 진행한다. (안그러면 무한루프가 되어 시간초과된다)

상한액을 (left+right)에서 2로 나눈값인 mid로 정했다.

 

그리고 mid일때 요청금액을 나는 람다함수를 이용해서 했다.(물론 반복문을 써도된다)

budgets의 원소중 mid보다 작으면 그대로 값을 요청하고

원소값이 mid보다 크면 mid값으로 요청해야한다.  

 


[코드] Python

def solution(budgets, M):
    budgets=sorted(budgets)
    left=0
    right=budgets[-1]
    
    # 상한액이 right일때의 예산요청보다 M이 더 큰 경우
    if M>= sum(budgets):
        return right
    
    while True:
        mid= int((left+right)//2)
        if left==mid or right==mid:
            break

        result=sum(map( lambda budget: budget if budget<mid else mid, budgets))
        if result==M:
            return mid
        
        elif result<M: #left ~mid-1탐색
            left=mid
            
        else:#result>M => mid+1 ~right 탐색
            right=mid
        
    return mid
728x90
반응형
반응형
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
«   2024/04   »
1 2 3 4 5 6
7 8 9 10 11 12 13
14 15 16 17 18 19 20
21 22 23 24 25 26 27
28 29 30
글 보관함