안녕하세요! 취업준비생의 알고리즘 공부입니다.😃
저의 공부가 많은 사람들에게 도움이 되었으면 좋겠습니다.
부족한 점에 대한 따끔한 지적도 환영입니다!
겸손한 자세로 배우도록 하겠습니다. 🙇♀️
순열, 조합, 중복 조합...?
들어도 헷갈리는 파이썬 itertools 라이버리 같이 배워요..!
🏦 순열 - permutations
말 그대로 "순" 순서있게 "열" 나열한 것을 의미합니다.
순번을 매긴다고 생각하면 쉬울 것 같아요!
은행 🏦 에서 우리는 대기표와 같이 순서를 부여해주는 것이지요 🤔
이때, 똑같은 사람에게 두개의 번호를 주지 않듯이 중복❌을 허용하지 않고 순서⭕️는 존재합니다.
from itertools import permutations
bank_people = ["할머니", "아저씨", "대학생"]
give_num = list(permutations(bank_people,3))
print(give_num)
#[('할머니', '아저씨', '대학생'), ('할머니', '대학생', '아저씨'), ('아저씨', '할머니', '대학생'), ('아저씨', '대학생', '할머니'), ('대학생', '할머니', '아저씨'), ('대학생', '아저씨', '할머니')]
만약 은행에 할머니, 아저씨, 대학생 이렇게 3명이 동시에 도착해서 대기표를 나눠준다면 위와 같은 경우의 수가 생깁니다.
🧢 조합 - combinations
어떤 조합이 이 코디에 가장 잘어울릴까?
만약 오늘의 코디에 가장 잘 어울리는 악세사리 조합을 찾는다고 가정합시다. 👓💍🧢👢🕶 다양한 악세사리가 있을 때, 우리는 똑같은 썬글라스를 2개 낄 순 없습니다. 때문에 중복❌을 허용하지 않습니다. 그리고 썬글라스와 모자를 쓰는데는 순서❌가 중요하지 않지요. 다만 사용할지 안할지만 고민합니다.
from itertools import combinations
accessary = ["목걸이", "썬글라스", "모자"]
OOTD = list(combinations(accessary,2))
print(OOTD)
#[('목걸이', '썬글라스'), ('목걸이', '모자'), ('썬글라스', '모자')]
만약 내가 가지고 있는 악세사리 목걸이, 썬글라스, 모자 중에서 2개만 착장하고 싶다면 아래와 같은 경우의 수로 오늘의 OOTD를 완성할 수 있습니다.
중복 순열 - product
앞서 우리는 순열을 배웠습니다. 순서가 있는 나열..!
그렇다면 중복 순열은 중복⭕️이 있는 나열입니다.
순열은 은행의 대기표의 예를 생각하면 된다면, 중복 순열은 설 맞이 과일 선물 세트 포장으로 생각해보겠습니다.
- 대형마트에서 마음에 드는 과일🍎🍋🍑🍈🍌🍊을 가져오면 예쁘게 포장을 해준다고 합시다.
- 영희는 멜론🍈🍈 2개를, 철수와 지민이는 귤🍊 사과🍎, 져와서 포장할 것입니다.
- 하지만 철수는 왼쪽에는 사과🍎 오른쪽에는 귤🍊이 오도록 포장하려고 하고, 지민이는 왼쪽에 귤🍊 오른쪽에는 사과🍎를 두려고 할 것입니다. 지민이, 철수, 영희의 선물세트는 모두 다른 경우로 봐야합니다.
때문에 중복 순열은 중복⭕️을 허용하며, 순서⭕️ 또한 존재합니다.
from itertools import product
fruits = ["사과", "멜론", "귤"]
gift_set = list(product(fruits,repeat=2))
print(gift_set)
#[('사과', '사과'), ('사과', '멜론'), ('사과', '귤'), ('멜론', '사과'), ('멜론', '멜론'), ('멜론', '귤'), ('귤', '사과'), ('귤', '멜론'), ('귤', '귤')]
마트에 사과, 멜론, 귤이 존재한다면, 위와 같은 선물세트들이 존재할 수 있습니다.!