반응형
코드1
# https://www.acmicpc.net/problem/15649
# https://teching.tistory.com/
import itertools
n, m = map(int,input().split())
nums = [i+1 for i in range(n)]
for ln in list(itertools.permutations(nums,m)):
for i in range(m):
print(ln[i],end= ' ')
print('')
코드 2
# https://www.acmicpc.net/problem/15649
# https://teching.tistory.com/
def bts(n, m, visited = [], k=0):
if len(visited) == m:
print(' '.join(map(str,visited)))
return
for i in range(1, n+1):
if i in visited: continue
visited.append(i)
bts(n,m,visited,i)
visited.pop()
n, m = map(int, input().split())
bts(n,m)
해설
처음에는 문제만 보고 단순하게 순열을 구해서 출력해주었다.
하지만 백트래킹을 이용하여 풀이해보고 싶어서 백트래킹을 이용하여 풀었다.
백트래킹에 대해서 간단하게 정리를 해보자면
백트래킹 (Backtracking) :
- 모든 경우의 수를 전부 고려하는 알고리즘.
- 상태 공간을 트리로 나타낼 수 있을 때 적합한 방식.
- DFS, BFS와 기본적인 방법은 같으나 경로를 탐색하기 이전에 조건을 추가해 불필요한 경로를 사전에 쳐내는 것이다.
반복문의 회수를 줄일 수 있음.
DFS (깊이 우선 탐색) :
- 트리나 그래프에서 한 루트로 탐색하다가 특정 상황에서 최대한 깊숙이 들어가서 확인한 뒤 다시 돌아가 다른 루트로 탐색하는 방식.
- 일반적으로 재귀 함수로 구현. (스택으로 구현하기도 함)
- 장점 :
현 경로상의 노드들만을 기억하면 되므로 저장 공간의 수요가 비교적 적다.
목표 노드가 깊은 단계에 있을 경우 해를 빨리 구할 수 있다. - 단점 :
해가 없는 경로에 깊이 빠질 가능성이 있음. (해결 방법: 임의 깊이까지만 탐색하도록 설정)
얻어진 해가 최단 경로가 된다는 보장이 없음.
BFS (너비 우선 탐색) :
- 모든 경로를 동시에 진행하여 탐색하는 방식.
- 장점 :
최단 경로를 찾을 수 있다. - 단점 :
경로가 매우 긴 경우에는 저장 공간의 수요가 비교적 많다.
해가 없는 경우 해도 못 찾고 끝내지도 못할 수 있음.
반응형
'알고리즘 테스트 > 백준' 카테고리의 다른 글
백준 2580 : 스도쿠 (파이썬) (0) | 2022.02.04 |
---|---|
백준 9663 : N-Queen (파이썬) (0) | 2022.02.04 |
백준 2108 : 통계학 (파이썬) (0) | 2022.01.31 |
백준 10989 : 수 정렬하기3(카운팅정렬) (0) | 2022.01.30 |
백준 2751 : 수 정렬하기2 (파이썬) (0) | 2022.01.29 |