level1_예산
2024. 2. 23. 23:57ㆍ파이썬_알고리즘(코딩테스트)/level1


내가 제출한 코드
def solution(d, budget):
answer = 0
d.sort()
for i in d:
budget -= i
if budget < 0:
break
answer += 1
return answer
d를 오름차순으로 정렬해준 뒤 budget에서 빼주는 식으로 코드를 짰다.
또한 budget이 음수가 될 때 빠져나온다.
다른사람이 제출한 코드
def solution(d, budget):
d.sort()
while budget < sum(d):
d.pop()
return len(d)
조건문에서 주어진 budget이 d 리스트에 있는 모든 항목의 합보다 작은 동안 계속 반복되는 구조였다.
d.pop()는 d 리스트의 마지막항목을 제거하는 함수인데, 리스트가 오름차순으로 정렬되어 있기 때문에 가장 비용이 높은
항목부터 제거하여 예산 안에서 항목들을 맞췄다.
여기서 while budget < sum(d) 라인은 sum(d)를 매 반복마다 계산하게 되므로 비효율적일 수도 있다고 한다.
예를 들어서 리스트 d의 길이가 n일 때, sum(d)의 호출은 O(n)의 시간 복잡도를 가지지만,
d에서 원소를 하나씩 제거하는 과정이 많이 반복된다면, 전체 코드의 시간 복잡도 O(n^2)에 이를 수 있다.
이를 개선하기 위한 방법 중 하나가 제거되는 항목의 값을 budget에서 빼는 것이라고 한다.
def solution(d, budget):
d.sort()
total_cost = sum(d) # 미리 전체 비용을 계산
while d and budget < total_cost:
total_cost -= d.pop() # 마지막 원소를 제거하고 그 값을 total_cost에서 뺌
return len(d)
'파이썬_알고리즘(코딩테스트) > level1' 카테고리의 다른 글
| level1_크기가 작은 부분문자 (0) | 2024.02.26 |
|---|---|
| level1_이상한 문자 만들기 (0) | 2024.02.25 |
| level1_3진법 뒤집기 (0) | 2024.02.22 |
| level1_같은 숫자는 싫어(스택/큐) (0) | 2024.02.21 |
| level1_최대공약수와 최소공배수 (1) | 2024.02.19 |