결론부터 말하면 직접 조합을 구현하는 것 보다 python 라이브러리 'itertools'를 사용해 구하는 방법이 10배 정도 빨랐다.
permutation(반복가능한객체, r)
반복 가능한 객체(=길이가 n인)에 대해서 중복을 허용하지 않고 'r'를 뽑아서 나열한다.
뽑힌 순서대로 나열하기 때문에 순서에 의미가 있다. (즉, 같은 값이 뽑히더라도 순서가 다르면 경우의 수로 취급한다.)
중복을 허용하지 않고 뽑아낸다.
combinations(반복가능한 객체, r)
중복을 허용하지 않은 채로 결과값을 내보낸다.
4개의 product를 사용해 보았다.
첫 번째의 결과
-> list1 [(1, 'a'), (1, 'b'), (2, 'a'), (2, 'b'), (3, 'a'), (3, 'b'), (4, 'a'), (4, 'b')]
두 번째 결과
-> list2 [(0, 0, 0), (0, 0, 1), (0, 0, 2), (0, 1, 0), (0, 1, 1), (0, 1, 2), (0, 2, 0), (0, 2, 1), (0, 2, 2), (1, 0, 0), (1, 0, 1), (1, 0, 2), (1, 1, 0), (1, 1, 1), (1, 1, 2), (1, 2, 0), (1, 2, 1), (1, 2, 2), (2, 0, 0), (2, 0, 1), (2, 0, 2), (2, 1, 0), (2, 1, 1), (2, 1, 2), (2, 2, 0), (2, 2, 1), (2, 2, 2)]
세 번째 결과
-> list3 [(1, 1), (1, 2), (1, 3), (2, 1), (2, 2), (2, 3), (3, 1), (3, 2), (3, 3)]
네 번째 결과
->list4 [(1, 1, 1), (1, 1, 2), (1, 1, 3), (1, 2, 1), (1, 2, 2), (1, 2, 3), (1, 3, 1), (1, 3, 2), (1, 3, 3), (2, 1, 1), (2, 1, 2), (2, 1, 3), (2, 2, 1), (2, 2, 2), (2, 2, 3), (2, 3, 1), (2, 3, 2), (2, 3, 3), (3, 1, 1), (3, 1, 2), (3, 1, 3), (3, 2, 1), (3, 2, 2), (3, 2, 3), (3, 3, 1), (3, 3, 2), (3, 3, 3)]
이런식으로 어떻게 조합하느냐에 따라서 수를 조합해서 출력 해 준다.
combination_with_replacement(반복 가능한 객체, r)
이런 방법을 사용하면 더욱 쉽게 각 조합을 구할 수 있다.
그리고 math의 squrt