EPI00 개발일지

파이썬 순열, 조합, 중복순열, 중복조합 +파스칼의 삼각형 계산하는 코드 본문

프로그램 개발?

파이썬 순열, 조합, 중복순열, 중복조합 +파스칼의 삼각형 계산하는 코드

EPI00 2021. 8. 9. 15:53

순열, 조합, 중복순열, 중복조합을 계산하는 공식이다. 

사실 저게 각각 뭘 의미했는지는 이미 다 까먹었지만, 아무튼 저 공식대로 계산하면 그 값을 구할 수 있다. 

그래서 이걸 파이썬으로 구현할건데, 각각 함수로써 구현을 할 것이다. 단, 중복조합은 조합을 이용해 계산하고, 조합은 순열을 이용해 계산하는 방식으로 할 것인데, 순열의 계산 과정에서 팩토리얼이 필요하니....팩토리얼도 따로 함수로 구현하는 것이 편할 것이다. 

그래서 완성한 함수들이다 :

def fac(n):#팩토리얼
    r = 1
    for i in range(n):
        r *= (i+1)
    return r
def P(n,r):#nPr
    return fac(n)/fac(n-r)
def C(n,r):#nCr
    return P(n,r)/fac(r)
def Pi(n,r):#nΠr
    return n**r
def H(n,r):#nHr
    return C(n+r-1,r)

아무튼 완성을 했고, 여기서 조합을 이용해 파스칼의 삼각형을 출력하는 함수도 살짝 만들어보았다. 

def pascal(n):
    i = 0
    while i<=n:
        r = ''
        j = 0
        while j<=i:
            r+=str(int(C(i,j)))+' '
            j+=1
        i+=1
        print(r)
    return

사실 옛날에 codeup등에서 문제를 풀 땐 C++을 사용했었기 때문에 파이썬식 for문에 적응하지 못하고 while문으로 C언어식 for문을 사용하는 모습이다....

아무튼 이걸 적당히 다듬어서 전체 코드를 한번 만들어보면....

def fac(n):#팩토리얼
    r = 1
    for i in range(n):
        r *= (i+1)
    return r
def P(n,r):#nPr
    return fac(n)/fac(n-r)
def C(n,r):#nCr
    return P(n,r)/fac(r)
def Pi(n,r):#nΠr
    return n**r
def H(n,r):#nHr
    return C(n+r-1,r)

def pascal(n):
    i = 0
    while i<=n:
        r = ''
        j = 0
        while j<=i:
            r+=str(int(C(i,j)))+' '
            j+=1
        i+=1
        print(r)
    return

def main():
    a = int(input("1, 2번 중 선택 : "))
    if a==1:
        asdf()
    else:
        qwer()

def asdf():
    a = int(input("1:순열 2:조합 3:중복순열 4:중복조합 선택 : "))
    s = input("n과 r의 값을 띄어쓰기를 사이에 두고 입력 : ").split(' ')
    n,r = int(s[0]),int(s[1])
    if a==1:
        print(str(n)+'P'+str(r)+' = '+str(P(n,r)))
    elif a==2:
        print(str(n)+'C'+str(r)+' = '+str(C(n,r)))
    elif a==3:
        print(str(n)+'Π'+str(r)+' = '+str(Pi(n,r)))
    else:
        print(str(n)+'H'+str(r)+' = '+str(H(n,r)))
    return
def qwer():
    a = int(input("파스칼의 삼각형 몇번째 줄 까지? "))
    pascal(a)
    return

if __name__=='__main__':
    main()

이런 코드가 완성이 된다.

사실 글 적기 귀찮다...