From 5f9938589963ead44345a703463f7f59bacde0f1 Mon Sep 17 00:00:00 2001 From: kjrstory Date: Wed, 13 Nov 2024 10:03:51 +0000 Subject: [PATCH] 20241113 --- documents/Algorithm/BaekJoon_15650.md | 62 +++++++++++++++++++++++++++ 1 file changed, 62 insertions(+) create mode 100644 documents/Algorithm/BaekJoon_15650.md diff --git a/documents/Algorithm/BaekJoon_15650.md b/documents/Algorithm/BaekJoon_15650.md new file mode 100644 index 000000000..44dfb173b --- /dev/null +++ b/documents/Algorithm/BaekJoon_15650.md @@ -0,0 +1,62 @@ +# BaekJoon 15650번 문제 - N과 M (2) + +* 문제: [백준 15650](https://www.acmicpc.net/problem/15650) +* 난이도: Silver 3 +* 날짜: 2024-11-13 + +## 문제 요약 + +1부터 N까지 자연수 중에서 중복 없이 M개를 고른 수열을 모두 출력하는 문제. +단, 고른 수열은 반드시 오름차순이어야 함. + + +## 풀이 방법 및 배워야 할 것: + + * **DFS**: 백트래킹을 사용해 모든 가능한 조합을 생성하고 조건에 맞는 조합만 출력. + * **조합**: `itertools.combinations`를 사용하여 간단히 조합을 생성. + * Python에서 `DFS`와 라이브러리 사용의 장단점 비교. + +## 풀이 코드: + +* DFS 풀이 + +```python +n, m = map(int, input().split()) +a = [0] * 9 # 선택한 숫자를 저장할 배열 +c = [False] * 9 # 방문 여부를 기록할 배열 + +def dfs(num, cnt): + if cnt == m: # M개의 숫자를 모두 선택한 경우 + print(' '.join(map(str, a[:m]))) + return + for i in range(num, n + 1): + if not c[i]: # 숫자 i를 아직 선택하지 않은 경우 + c[i] = True + a[cnt] = i # 숫자 선택 + dfs(i + 1, cnt + 1) # 다음 숫자를 선택 + c[i] = False # 백트래킹 + +dfs(1, 0) +``` + +* 조합 사용 풀이 + +```python +from itertools import combinations + +n, m = map(int, input().split()) + +# combinations을 사용해 조합 생성 +for combination in combinations(range(1, n + 1), m): + print(*combination) # 조합 출력 +``` + +--- + +## 배운 점 +- **DFS와 백트래킹**: 오름차순 조건을 만족시키기 위해 `num`을 인자로 전달하며 재귀 호출하는 방식. +- **itertools.combinations**: 조합 문제를 간결하게 해결할 수 있는 Python의 강력한 라이브러리. +- 두 가지 방식의 장단점 비교: + - DFS: 백트래킹 과정을 통해 문제의 로직을 깊이 이해 가능. + - 조합: 간단한 구현으로 시간과 코드량 절약. +