본문 바로가기

알고리즘

데일리 알고리즘 230116

728x90

데일리 알고리즘 230116


프로그래머스, 예산

 

프로그래머스

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

programmers.co.kr

 

 

📄 나의 코드

def solution(d, budget):
    d.sort()
    for i in range(1, len(d)+1):
        if(d[0] > budget): # 정렬 후, 첫번째 원소(min(d))가 budget보다 큰 경우, 예외처리
            return 0
        if(sum(d[:i]) > budget):
            break
        else:
            answer = i
    return answer

print("d : [1,3,2,5,4], budget : 9, reault : ", solution([1,3,2,5,4], 9))
print("d : [2,2,3,3], budget : 10, reault : ", solution([2,2,3,3], 10))
print("d : [3,1,1], budget : 3, reault : ", solution([3,1,1], 3))
print("d : [7,5,6], budget : 2, reault : ", solution([7,5,6], 2))

처음엔 조합문제로 이해하고 조합 구할 수 있는 라이브러리로 접근해 문제를 풀었다.

 

📄 나의코드-조합 라이브러리 이용

def solution(d, budget):
    if(min(d)>budget):
        return 0
    from itertools import combinations
    for r in range(1, len(d)+1):
        for c in combinations(d, r):
            if(sum(c) > budget):
                break
            else:
                answer = r
    return answer

 

📌 런타임 에러

from itertools import combinations
for c in combinations(d, r):

이 부분이 압도적으로 시간을 잡아먹음.

 

d에서 r만큼 원소를 뽑아 모든 경우의 수를 순회.

d의 원소의 갯수를 n이라고 할때

n! / (r! * (n-r)!)

순회하는 횟수는 위와 같다.

 

만약, 원소의 갯수(n)이 100개이고 r이 5라고 하면,

100 * 99 * 98* 97*96 / 5*4*3*2*1 = 75,287,520를 순회함.

따라서 combination을 쓰지 않고 푸는 방법을 생각해봐야 한다.

'알고리즘' 카테고리의 다른 글

DP, Dynaminc Programming  (0) 2023.01.17
데일리 알고리즘 230117  (0) 2023.01.17
데일리 알고리즘 230113  (0) 2023.01.13
자료구조 4주차 _ DFS & BFS  (0) 2023.01.12
데일리 알고리즘 230112  (0) 2023.01.12