<aside>
💬 lv0
, 그리디
여러 투자 기회가 주어졌을 때, 제한된 자본으로 가장 많은 투자를 할 수 있는 함수를 작성해주세요. 각 투자 기회는 투자 금액과 투자처로 되어 있습니다. 모든 투자는 독립적이며, 투자 금액의 합은 주어진 자본을 초과할 수 없습니다.
예를 들어, 자본이 50만원이고 투자 기회가 [(20만원, 'A기업'), (30만원, 'B기업'), (40만원, 'C기업')]
으로 주어진다면, 최대 분산 투자는 ['A기업', 'B기업']
입니다.
"최대 분산 투자" 문제에 대한 수정된 입출력 예와 입출력 설명은 다음과 같습니다:
입력 (투자 기회, 자본) | 출력 (분산 투자 기업 리스트) |
---|---|
[(200000, 'A기업'), (300000, 'B기업'), (400000, 'C기업')], 500000 | ['A기업', 'B기업'] |
[(100000, 'A기업'), (200000, 'B기업'), (300000, 'C기업')], 500000 | ['A기업', 'B기업'] |
[(50000, 'A기업'), (70000, 'B기업'), (120000, 'C기업')], 180000 | ['A기업', 'B기업'] |
첫 번째 예시에서 자본은 500,000원이며, 가장 많은 기업에 투자하기 위해 'A기업'과 'B기업'에 투자하는 것이 최적의 선택입니다. 'A기업'에 200,000원, 'B기업'에 300,000원을 투자하여 총 2개의 기업에 투자합니다.
</aside>
def solution(data):
investments, capital = data **#1 초기 변수 설정**
investments.sort(key=lambda x: x[0]) **#2 정렬**
selected_companies = [] **#3 빈 리스트 생성**
for cost, company in investments: **#4 모든 요소 순회**
if capital >= cost:
selected_companies.append(company)
capital -= cost
return selected_companies **#5 결과 반환**
초기 변수 설정
입력값 data
를 investments
, capital
로 나누어 할당한다. 각각 투자기회(회사), 자본에 해당한다.
정렬
투자기회를 오름차순으로 정렬한다.
빈 리스트 생성
selected_companies
라는 변수에 빈 리스트를 생성한다.
모든 요소 순회
cost, company
로 나누어 순회한다.if capital >= cost
→ 만약 자본이 투자기회의 자본값보다 크거나 같다면, selected_companies
리스트에 투자기회의 회사명을 추가한다.결과 반환
반복문, 조건문을 거친 selected_companies
리스트를 반환한다.
filter()
함수def solution(data):
asset = data[1]
lst = sorted(filter(lambda x: x[0] <= asset, data[0]))
ret = [] **#1 초기 변수 설정 및 정렬**
for money, company in lst: **#2 모든 요소 순회**
if asset < money:
break
asset -= money
ret.append(company)
return ret **#3 결과 반환**
초기 변수 설정 및 정렬
변수 asset
에 data[1]
, 자본을 할당한다.
filter
함수로 자본보다 같거나 작은 값들만 걸러주고 이를 오름차순으로 정렬한다. 그리고 빈 리스트 ret
을 선언해준다.
모든 요소 순회
각 행을 money, company
로 순회한다.
break
).asset
에 재할당해준다.ret
에 추가한다.결과 반환
모든 반복문과 조건문을 거친 리스트ret
을 반환한다.
함수 filter()
filter(함수, iterable)
(iterable
: 순서가 있고 순회 가능한 객체)iterator
를 결과값으로 반환해주는 내장함수(built-in-function)다.
iterable
을 대입해서 참인 결과만 반환해준다.generator
이기 때문에 list()
같은 자료형 함수로 감싸주어야 한다.break
break
를 만나면 해당 반복문을 즉시 빠져나온다.(=종료)