NIRVANA

[level 1] 예산 본문

Coding test(Python3)/Programmers

[level 1] 예산

녜잉 2023. 7. 18. 15:42

문제

S사에서는 각 부서에 필요한 물품을 지원해 주기 위해 부서별로 물품을 구매하는데 필요한 금액을 조사했습니다. 그러나, 전체 예산이 정해져 있기 때문에 모든 부서의 물품을 구매해 줄 수는 없습니다. 그래서 최대한 많은 부서의 물품을 구매해 줄 수 있도록 하려고 합니다.

물품을 구매해 줄 때는 각 부서가 신청한 금액만큼을 모두 지원해 줘야 합니다. 예를 들어 1,000원을 신청한 부서에는 정확히 1,000원을 지원해야 하며, 1,000원보다 적은 금액을 지원해 줄 수는 없습니다.

부서별로 신청한 금액이 들어있는 배열 d와 예산 budget이 매개변수로 주어질 때, 최대 몇 개의 부서에 물품을 지원할 수 있는지 return 하도록 solution 함수를 완성해주세요.

 

 

문제 접근법1

1) sum(d)의 값이 budget을 넘는지 확인한다. 

2) sum(d)의 값이 만약 budget보다 작거나 같으면 len(d)로 부서의 개수를 반환한다. 

3) budget보다 넘는다면 for문으로 원소를 하나씩 더하면서 budget이 넘는 시점을 확인한다. 

4) 부서의 개수이므로 넘는 시점(i)을 반환한다(아님 i-1+1...) (0부터 시작하므로..)

def solution(d, budget):
    answer = 0
    predict = 0
    
    if sum(d) < budget or sum(d) == budget:
        answer = len(d)
    else:
        for i in range(len(d)): 
            predict += d[i]
            
            if predict > budget:
                answer = i
                break 
        
    return answer

 

실패했다. 반례를 생각해보니까

예산 신청이 [4, 6, 2, 1]이고 예산이 7원이면

실제로는 3개의 부서를 지원해줄 수 있는데 위의 코드에서는 1개의 부서 밖에 지원해주지를 못한다.

어떻게 해야하지 고민하다가 오름차순으로 정렬을 하면 적은 것부터 더하니까 해결할 수 있겠다고 생각했다.

 

문제 풀이 접근법2

for문 전에 문자열 sort를 해주었다. 

def solution(d, budget):
    answer = 0
    predict = 0
    
    if sum(d) <= budget:
        answer = len(d)
    else:
        d.sort()
        for i in range(len(d)): 
            predict += d[i]
            
            if predict > budget:
                answer = i
                break 
        
    return answer

 

 

 


 

다른 분들 풀이

def solution(d, budget):
    d.sort()
    cnt = 0
    # if sum(d) == budget :
    #     answer = len(d)
    # elif sum(d) < budget :
    #     for i in d :
    #         budget -= i
    #         cnt += 1
    #         answer = cnt
    # else :
    for i in d :
        budget -= i
        if budget < 0 :
               break
        cnt += 1
    answer = cnt
    return answer

전체 예산에서 각 부서만큼 신청한 예산을 빼고 (예산을 할당할) 부서의 개수를 세는 것도 좋은 아이디어인 것 같다!!!

 

def solution(d, budget):
    d.sort()
    while budget < sum(d):
        d.pop()
    return len(d)

위 코드와 비슷한 방법! 

 


 

조건문+반복문보단

당연히 반복문만 쓰는게 좋은 코드겠죠...

흑 진짜 분발해야지...

'Coding test(Python3) > Programmers' 카테고리의 다른 글

[level 1] 최소직사각형(다시!)  (0) 2023.07.24
[level 1] 삼총사  (0) 2023.07.20
[level 1] 이상한 문자 만들기  (0) 2023.07.18
[level 1] 3진법 뒤집기  (0) 2023.07.18
[level 1] 같은 숫자는 싫어(다시??)  (0) 2023.07.17