재미는 없지만. 도움은 되는. 어떻하지.
파이썬에는 아직도 내가 모르는 많은 함수들이 존재한다.
아마도 평생 다 사용해 볼 수 없을 가능성이 거즘 99% 아닐까.
계속 생겨날 것이고,
지금 이렇게 글을 쓰는 와중에도 핸썸하고 스마트한 누군가가
열심히 Python 생태계를 위해서 만들고 있기 때문에.
그 중 하나를 공유하려고 한다.
itertools에 있는 순열 & 조합 기능이다.
예를 들어,
1. N개의 도시를 각각 한번씩만 돌아다니려고 한다.
2. 모든 도시는 연결되어 있다.
3. 각 도시를 이동 할 때에는 비행기를 타는데 돈이 필요하다.
4. 모든 도시를 다 둘러보고 처음 출발한 도시로 돌아와야 한다.
5. 가장 적은 돈으로 완수 할 수 있는 경로를 계획해야 한다.
꼭 예로 나타난 '도시'가 아니여도,
우리가 업무상 코드를 작성 할 경우에도
이런 경우가 발생 할 수 있다.
여기서는,
전체 경로를 우선적으로 나타낼 수 있는 간단한 파이썬 함수를 보여주려고 한다.
단순하게 N을 3 이라고 가정하고,
모든 경우의 수를 나열한다면?
그냥 노가다(?)로,
1. A, B, C
2. A, C, B
3. B, A, C
4. B, C, A
5. C, A, B
6. C, B, A
3*2*1의 경우의 수를 보여준다.
이걸!
파이썬의 itertools 함수를 활용하면,
Permutation = '순열', '치환' 이라는 뜻을 가진다.
위에서 언급한 3*2*1이 순열을 구하는 방법이다.
사실,
이거 알면 위에 나온 조건값을 통해서 원하는 답을 금방 찾을 수 있다.
언제나,
고민하는 부분은 이렇다.
이렇게 잘 만들어진 함수를 사용할 것인지 or 직접 구현을 할 것인지.
나는 전자를 택한다. 지금까지 그래왔다.
실예로,
C를 매우 잘 짜는 사람이 있었다.
Python의 Numpy는 transpose 라는 함수가 존재한다.
C를 매우 잘 짜는 사람이 transpose를 직접 구현하였다.
무엇이 더 좋은 성능을 가져다 주었을까?
답은,
나의 선택에 힘을 실어주었다.
100배 정도의 속도 차이가 존재했다.
왜 이런일이...
그건 각자 생각하도록 하자.
이번엔 조합.
3개의 구슬 중에서 2개를 선택한다.
각 구슬은 1, 2, 3 번호를 달고 있다.
총 경우의 수는 3C2 == 3*2/2! == 3 이다.
이걸!
파이썬의 itertools 함수를 활용하면,
'생산성' 이라는 말이 여기서 나올 수 있다는 생각이 들었다.
이 외에도 다양한 함수들이 존재한다.
Ref: https://docs.python.org/3.7/library/itertools.html
30분 정도에 Jupyter를 통해서 전체를 확인해 볼 수 있었다.
이제 시작하는 사람(나를 포함해서)
이라는 마음가짐으로 위 문서를 공부하면
분명히 지루한 코딩 작업에 작은 도움이 될 것이라고 생각한다.
끝.