알고리즘/프로그래머스

[파이썬] 프로그래머스_구슬을 나누는 경우의 수

딱따구르리 2022. 10. 26. 12:48
728x90
반응형

문제

 

https://school.programmers.co.kr/learn/courses/30/lessons/120840

 

프로그래머스

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

programmers.co.kr


 

해설

 

1) 첫 풀이(시간 초과)

itertools의 combinations를 imort해서 combinations(balls, share) 로 풀려고 했는데

combinations는 아래의 코드처럼 balls가 숫자가 아니라 리스트 형태여야 한다.

from itertools import combinations

nums = [1,2,3,4]
combi = list(combinations(nums, 2))


#[(1, 2), (1, 3), (1, 4), (2, 3), (2, 4), (3, 4)]

그래서 balls만큼 0을 할당해 리스트를 만들어 대신 넣어줬더니 시간초과가 났다.

#시간 초과 난 코드
from itertools import combinations
def solution(balls, share):
    balls_lst = [0] * balls
    
    combi = list(combinations(balls_lst, share))

    return len(combi)

 

2) 두번째 풀이(성공)

그 다음으로는 조합이 n! // (r! * (n-r)!) 이므로 직접 계산해버렸다.

def solution(balls, share):
    answer = 0
    
    top = 1  #n!
    for i in range(1, balls+1):
        top *= i
    
    btm1 = 1  #r!
    btm2 = 1  #(n-r)!
    for i in range(1, share+1):
        btm1 *= i
    
    for i in range(1, balls-share+1):
        btm2 *= i
        
    answer = top // (btm1*btm2)
    return answer

 

아래의 코드는 다른 사람의 코드이다.

math 모듈에 comb 함수가 있다는 걸 이번에 알았다.

math.comb(n, k)는 nCk와 같은 조합 값을 반환하므로 이를 사용하면 쉽게 풀 수 있다. 


코드

 

-파이썬

import math

def solution(balls, share):
    return math.comb(balls, share)
728x90
반응형