티스토리 뷰
728x90
반응형
https://programmers.co.kr/learn/courses/30/lessons/43237?language=python3
[풀이]
이진탐색의 틀만 안다면 풀 수 있다.
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
반응형
'알고리즘 > Programmers' 카테고리의 다른 글
[프로그래머스] 입국심사 (0) | 2020.04.21 |
---|---|
[프로그래머스] 가장 큰 정사각형 (0) | 2020.04.20 |
[프로그래머스] 베스트앨범 (0) | 2020.04.08 |
[프로그래머스] 단어변환 (0) | 2020.04.03 |
[프로그래머스] 종이접기 (0) | 2020.03.22 |
반응형
공지사항
최근에 올라온 글
최근에 달린 댓글
- Total
- Today
- Yesterday
링크
TAG
- git
- 클린아키텍쳐
- Nest.js
- jest
- node.js
- RDBMS
- 바이트디그리
- 한달어스
- 나도 할 수 있다
- TDD
- 디지털디톡스
- MongoDB
- MySQL
- Jekyll
- 스마트폰중독
- 한달독서
- 습관개선
- nestjs jest
- TypeScript
- OS
- 갓생살자
- 미완
- 참고
- vscode
- Mongoose
- nestjs
- typeORM
- 개발용어
- gem
- IT용어
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 |
글 보관함