알고리즘 문제풀이를 이어가다가 DFS (깊이우선탐색) 주제를 공부하게 되었다.
예제로 나온 문제에서 이항계수 개념을 활용해야 하는 문제가 나왔는데, 졸업한지 오래되어 개념을 까먹었다..
다시 개념을 익힐 겸! 기록으로 남겨본다.
1. 이항계수
이항계수?
이항식을 이항 정리로 전개했을 때 각 항의 계수이며, 주어진 크기의 (순서 없는) 조합의 가짓수
이항계수의 표현식은 nCk 로 표현된다.
nCk = n! / (k!(n-k)!)
아래는 n이 5이고 k가 3일때 5C3을 구하는 과정을 트리형태로 그려보았다.

이항계수 계산법인 팩토리얼로 계산했을때 답이 10 이 나오는데 직접 flow를 그려가보니 정말 10개의 가짓수가 나왔다.
2. 이항계수 계산하기
2-1) DFS (깊이우선탐색) - 재귀함수 활용하기
재귀함수를 활용해 중복을 허용하지 않는 n개 중 k 개를 구하는 방법은 아래와 같다.
# L = level
# s = start point
def DFS(L, s):
global cnt
if L == m:
for row in res:
print(row, end=" ")
print()
else:
for i in range(s, n+1):
res[L] = i
DFS(L+1, i+1)
if __name__ == "__main__":
n,m = map(int, input().split())
res = [0]*m
DFS(0, 1)
-------------------------------------------------
1 2
1 3
2 3
여기서 중복을 허용하지 않기 위해 DFS 함수 내의 s값은 1직전 s값보다 1만큼씩 증가하여 다음 level로 넘어가게 한다.
중복을 허용한 가짓수를 확인하려면 아래와 같이 코드를 수정하면 된다.
# L = level
# s = start point
def DFS(L, s):
global cnt
if L == m:
for row in res:
print(row, end=" ")
print()
else:
for i in range(1, n+1): # s부터 시작하는것 대신 항상 1부터 시작하도록 변경
res[L] = i
DFS(L+1, i+1)
if __name__ == "__main__":
n,m = map(int, input().split())
res = [0]*m
DFS(0, 1)
-------------------------------------------------
1 1
1 2
1 3
2 1
2 2
2 3
3 1
3 2
3 3
2-2) python 라이브러리 itertools 활용하기
python nCk 계산에 활용할수 있는 라이브러리가 있다. (아주.. 굿...) 바로 itertools
이다.
재귀함수를 통해 문제를 풀면서 이해가 되지 않아 머리를 쥐어뜯어가면서.. 노트에 받아적으면서 겨우 이해가 됐을 때 이 라이브러리를 알고 신세계를 맛봤다

그러나 일부 코테에서는 해당 내장함수 사용을 금지하는 경우도 있으니 반드시 재귀함수 방식으로의 풀이도 익혀두어야 한다.
지난 년도 삼성 코테에서 itertools 라이브러리 사용을 막았다는....
또한 "특정 조건" 을 충족해야하는 조합을 구할땐 이런 함수 사용이 어려울 수 있으므로 주의!!
a) itertools 의 permutations
중복을 허용하는 리스트 n 중에서 k개를 선별하는 가짓수 반환
n = [1, 2, 3]
k = 3
for tmp in it.permutations(n, k):
print(tmp)
-------------------------------------------------
(1, 2)
(1, 3)
(2, 1)
(2, 3)
(3, 1)
(3, 2)
b) itertools 의 combinations
중복을 허용하지 않는 n개 중 k개를 선별하는 가짓수 반환
n = [1, 2, 3]
k = 3
for tmp in it.combinations(n, k):
print(tmp)
-------------------------------------------------
(1, 2)
(1, 3)
(2, 3)
이어서..!!! 어흐 어려워
'풀이로그' 카테고리의 다른 글
[Java] 코딩테스트 값 입력받는 방법 : Scanner, next(), nextInt(), nextLine() (0) | 2024.02.02 |
---|---|
[알고리즘] Softeer | GBC 풀이 (python) (1) | 2024.02.02 |
[자료구조] 큐 (Queue)와 데크 (Deque) (1) | 2024.01.29 |
[후위표기식] 스택 알고리즘 문제 예시로 알아보기 (1) | 2024.01.27 |
[Python] 아스키 코드와 문자, chr(), ord() (0) | 2024.01.24 |