관리 메뉴

클라이언트/ 서버/ 엔지니어 "게임 개발자"를 향한 매일의 공부일지

함수형 프로그래밍 다루기 2 - 순열과 조합, 좌표 정렬하기 본문

프로그래밍 언어/파이썬

함수형 프로그래밍 다루기 2 - 순열과 조합, 좌표 정렬하기

huenuri 2024. 10. 6. 16:34

이제부터 모든 라이브러리를 학습하지 않고 필요하고 중요하다고 생각되는 부분 위주로 학습하려고 한다.


 

 

 

 

순서를 생각하며 카드를 뽑으려면? - itertools.permutations

반복 가능 객체 중에서 r개를 선택한 순열을 반환하는 함수이다.

 

1, 2, 3 숫자가 적힌 3장의 카드에서 두 장의 카드를 꺼내 만들 수 있는 2자리 숫자를 모두 구하려면 어떻게 해야 할까?

 

3장의 카드 중 순서에 상관없이 2장을 뽑는 경우는 모두 3가지이다. 하지만 순서를 더하면 6가지가 된다. 이 순열은 itertools.permultations()를 사용하면 간단히 구할 수 있다.

 

만들 수 있는 2자리 숫자는 다음과 같이 모두 6가지이다.


 

 

 

조합

3장의 카드에서 순서에 상관없이 2장을 고르는 조합은 itertools.combinations()를 사용하면 된다.


 

 

 

 

로또의 모든 가짓수를 구하려면? - itertools.combinations

반복 가능 객체 중에서 r개를 선택한 조합을 이터레이터를 반환하는 함수이다.

 

1~45 중 서로 다른 숫자 6개를 뽑는 로또 번호의 모든 경우의 수(조합)를 구하고 그 개수를 출력하려면 어떻게 해야 할까?

 

선택할 수 있는 로또 번호의 가짓수는 8145060가지이다. 


 

 

 

순서대로 좌표를 정렬하려면? - functools.cmp_to_key

sorted()와 같은 정렬 함수의 key 매개변수에 함수를 전달할 때 사용하는 함수이다. 단, func() 함수는 두 개의 인수를 입력하여 첫 번째 인수를 기준으로 그 둘을 비교하고 작으면 음수, 같으면 0, 크면 양수를 반환하는 비교 함수이어야 한다.

 

다음과 같이 2차원 병면 위의 점 N개를 (x, y) 좌표로 구성한 리스트가 있다. y 좌표가 증가하는 순으로 정렬하되 y 좌표가 같으면 x 좌표가 증가하는 순으로 좌표를 정렬하고 이를 출력하는 프로그램을 만들려면 어떻게 해야 할까?


 

 

이 문제는 sorted() 함수의 두 번째 key 개개변수에 특별한 방법으로 정렬할 수 있는 함수를 전달하여 해결해야 한다. key에 함수를 전달하려면 functools.cmp_to_key()를 사용한다.

 

y 좌표 순으로 정렬하되 y 좌표가 같다면 x 좌표 순으로 정렬한다.


 

 

 

 

기존 함수로 새로운 함수를 만들려면? - functools.partial

하나 이상의 인수가 이미 채워진 새 버전의 함수를 만들 때 사용하는 함수이다.

 

다음은 입력한 인수의 합과 곱을 choice값에 따라 선택적으로 반환하는 사용자 정의 함수 add_mul()이다.

예를 들어 add_mul('add', 1, 2, 3, 4, 5)를 호출하면 1~5인 합인 15를 반환하고, add_mul('mul', 1, 2, 3, 4, 5)를 호출하면 120이 반환된다. 그렇다면 add(), mul() 함수를 만들려면 어떻게 해야 할까?

이 문제의 일반적인 풀이는 다음과 같다.

 

하지만 functools.partial()을 사용하면 다음처럼 더 간결하게 코드를 작성할 수 있다.

 

 

partial은 이처럼 하나 이상의 인수를 미리 채운 새 버전의 함수를 만 드는데 유용하다.


 

 

 

 

다양한 기준으로 정렬하려면? - operator.itemgetter

주로 sorted와 같은 함수의 key 매개변수에 적용하여 다양한 기준으로 정렬할 수 있도록 하는 모듈이다.

 

학생의 이름, 나이, 성적 등의 정보를 저장한 다음과 같은 students 리스트가 있다고 하자.

 

students 리스트에는 3개의 튜플이 있으며 각 튜플은 순서대로 이름, 나이, 성적에 해당하는 데이터로 이루어졌다. 이 리스트를 나이순으로 정렬하려면 어떻게 해야 할까?


 

 

 

이 문제는 key 매개변수에 itemgetter()를 적용하면 쉽게 해결할 수 있다.

 

이 코드는 튜플을 기준으로 나이순으로 정렬한 것이다. 이제 딕셔너리일 때도 age를 기준으로 정렬해 보자.

 

 

age 순으로 잘 정렬되었다.

 


 

 

 

학습을 마치고

이렇게 해서 함수형 프로그래밍을 다루는 라이브러리를 학습해 보았다.