Notice
Recent Posts
Recent Comments
Link
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | |||||
3 | 4 | 5 | 6 | 7 | 8 | 9 |
10 | 11 | 12 | 13 | 14 | 15 | 16 |
17 | 18 | 19 | 20 | 21 | 22 | 23 |
24 | 25 | 26 | 27 | 28 | 29 | 30 |
31 |
Tags
- dfs
- 프로그래밍
- dynamic
- python
- github
- DP
- Material
- W3Schools
- c++
- Class
- 오류
- guide
- Unreal Engine 5
- 파이썬
- C#
- loop
- String
- 시작해요 언리얼 2022
- 재귀
- 문제풀이
- w3school
- 기초
- Basic
- Unity
- Algorithm
- Tutorial
- Programming
- 백준
- UE5
- parameter
Archives
- Today
- Total
행복한 개구리
백준 22.01.27. 15649번 - N과 M (1) 본문
퇴각검색 - 위키백과, 우리 모두의 백과사전
퇴각검색(영어: backtracking, 한국어: 백트래킹)은 한정 조건을 가진 문제를 풀려는 전략이다. "퇴각검색(backtrack)"이란 용어는 1950년대의 미국 수학자 D. H. 레머가 지었다. 문제가 한정 조건을 가진
ko.wikipedia.org

arr = []
def dfs(n, m):
if len(arr) == m:
print(" ".join(map(str, arr)))
return
for i in range(1, n+1):
if i not in arr:
arr.append(i)
dfs(n, m)
arr.pop()
N, M = map(int, input().split())
dfs(N, M)
- 백트래킹을 활용한 문제풀이입니다.
- 백트래킹은 브루트포스와 비슷하게 해를 얻을 때까지 모든 가능성을 시도합니다.
- 검색방법이 이진트리 검색방법과 상당히 유사합니다.
퇴각검색 - 위키백과 - 깊이 우선 탐색(Depth First Search)를 사용합니다.
- 따라서 재귀함수로 구현되며 이는 dfs라는 이름의 함수로 선언했습니다.
- arr은 모든 답을 담고있는 리스트가 아닌, 재귀를 통해 하나의 답을 담게되는 리스트라고 보면 편합니다.
- dfs내의 반복문을 먼저 설명하자면
- 반복되지 않는 수가 검색됐을 때 준비된 arr리스트에 추가해줍니다.
- 재귀를 통해 반복되지 않는수를 다시 검색합니다.
- 재귀를 통해 진행하다보면 제일 처음으로 arr = [1, 2, 3, 4]가 될 것입니다.
- 이 때, dfs의 if문의 조건이 충족됩니다. 따라서 함수에 따라 출력되고 반환됩니다.
- 재귀가 풀린 arr[1, 2, 3, 4]는 pop() 메서드를 통해 arr[1, 2, 3]이 됩니다.
- arr[1, 2, 3]에서 3 = 세번째 재귀함수 반복문의 i값이므로 pop()된 후에 4번째 반복으로 넘어갑니다
- 따라서 arr[1, 2, 4]가 되며 다시 재귀를 통해 arr[1, 2, 4, 3]이 완성됩니다.
- 위 같은 과정을 통해 모든 답을 찾을 수 있습니다.
- join메서드는 이터러블 객체의 요소들을 원하는 사잇값을 설정하여 이어주는 역할을 합니다.
- ex) "*".join(["가나", "다라", "마바"]) = "가나*다라*마바"
- 정답 코드에서는 int요소들을 str형식으로 바꾸기 위해서 map을 사용했습니다.
'Algorithm > BaekJoon' 카테고리의 다른 글
백준 22.01.28. 15651번 - N과 M (3) (0) | 2022.01.28 |
---|---|
백준 22.01.28. 15650번 - N과 M (2) (0) | 2022.01.28 |
백준 22.01.27. 18870번 - 좌표 압축 (0) | 2022.01.27 |
백준 22.01.27. 10814번 - 나이순 정렬 (0) | 2022.01.27 |
백준 22.01.27. 1181번 - 단어 정렬 (0) | 2022.01.27 |