일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | |||||
3 | 4 | 5 | 6 | 7 | 8 | 9 |
10 | 11 | 12 | 13 | 14 | 15 | 16 |
17 | 18 | 19 | 20 | 21 | 22 | 23 |
24 | 25 | 26 | 27 | 28 | 29 | 30 |
- homogeneous linear system
- trivial solution
- 이진 탐색
- matrix fo a linear transformation
- one-to-one
- 코틀린 시작하기
- 일차변환
- matrix trnasformations
- Big Theta
- 빅오메가
- NumPy
- Big-Oh 예제
- recursive algorithms
- linear dependence
- Big-Oh notation
- 배열 섞기
- 빅세타
- solutions of matrix equation
- matrix-vector product
- 랜덤 순서 배열
- nontrivial solution
- nonhomogeneous linear system
- 빅오 표기법
- Big-O 예제
- 알고리즘 분석의 실례
- 코틀린 Hello World!
- 재귀함수
- Big Omega
- python
- itertools
- Today
- Total
코딩 연습
(파이썬) 모든 조합의 경우 나열하기 본문
순열의 경우를 나열하는 것과 조합의 경우를 나열하는 것은 비슷한 듯 비슷하지 않은것 같다.
일단 원리는 다음과 같다.
abcde 중 3개를 선택하는 조합을 생각한다면
먼저 abc 가 될 수 있고, 이제 마지막 알파벳을 하나씩 오른쪽으로 옮겨가며 선택한다.
그래서 얻을 수 있는 것이 abd, abe가 된다. 알파벳이 마지막까지 오게 되면 이제 알파벳 b을 오른쪽으로 옮겨 똑 같은 작업을 반복한다.
그래서 얻을 수 있는 것이 acd, ace가 된다.
다시 c를 오른쪽으로 한 칸 옮기면 ade가 선택된다.
이제 a를 오른쪽으로 한 칸 옮겨 같은 작업을 반복한다.
그래서 얻을 수 있는 것이 bcd, bce가 되고, 다시 c를 오른쪽으로 한 칸 옮겨 얻는 것이 bde가 된다.
마지막으로 b를 한 칸 오른쪽으로 옮기면서 얻는 것이 cde가 되는 것이다.
아마 원리는 누구나 다 알고 있을 것이다. 다만 이걸 어떻게 코드로 구현하느냐의 문제로 골치 아플 것이다.
여기서도 재귀적인 방법을 사용하게 되는데, 파이썬에서 제공하는 생성자인 yield 를 사용하면 코드가 훨씬 더 간단해 진다. 반복자와 생성자에 관한 내용은 이곳을 참조하기 바란다.
def combination(elements, length):
for i in range(len(elements)):
if length==1:
yield elements[i]
else:
for next in combination(elements[i+1:len(elements)], length-1):
yield elements[i]+next
if __name__=="__main__":
elements=input("나열할 요소들을 입력하시오 : ")
length=int(input("요소들 중 몇 개를 뽑을 것인지 입력하시오 : "))
result=list(combination(elements, length))
print("%s 중 %d개를 선택하는 조합의 경우는 다음과 같이 %d 가지 있습니다." % (elements, length, len(result)))
print()
for i in range(len(result)):
print("%d. %s" % (i+1, result[i]))
print()
사실 코드만 주고 이해하라고 하기엔 무리가 있지만, 이걸 어떻게 설명해야 할지 모르겠다.
나도 처음에는 연습장에다가 하나씩 써 가면서 프로세스를 이해했으니까..
이걸 한 번에 이해한다면 프로그래밍 고수이거나 혹은 천재일 가능성이 높다. ㅋㅋ (왜냐하면 난 이해하는데 한참 걸렸으니까)
여하튼 위 코드를 철저하게 분석해서 다른 여러 가지 경우에 유용하게 사용할 수 있게끔 한다면 인생이 편안해질것 같다.
'Python' 카테고리의 다른 글
(파이썬) 최대공약수 구하기 (0) | 2016.03.15 |
---|---|
(파이썬) 완전제곱수 판별 (0) | 2016.03.15 |
(파이썬) 소수판정 (0) | 2016.03.15 |
(파이썬) 소인수 분해 (0) | 2016.03.15 |
(파이썬) 소수 발생기 (0) | 2016.03.15 |