728x90
반응형
import sys
input = sys.stdin.readline
N, M = map(int, input().split())
visited = [False] * N
numbers = list(map(int, input().split()))
numbers.sort()
result = [-1] * M
def backTracking(depth):
if depth == M:
print(' '.join(map(str, result)))
return
# temp 변수를 활용하여 완성된 중복 순열을 방지한다.
temp = 0
for i in range(N):
if not visited[i] and temp != numbers[i]:
result[depth] = numbers[i]
visited[i] = True
temp = numbers[i]
backTracking(depth + 1)
visited[i] = False
backTracking(0)
여기서 애좀 먹었다. 별거 아닌 거 같은데 입력값으로 중복된 숫자가 들어오기 때문에 까다롭다.
따라서 완성된 중복 순열을 배제하는 게 매우 헷갈린다.
visited를 사용하면 중복된 숫자가 들어오더라도 각 1번씩 사용되기 때문에 중복 순열이 생성되지 않을 것 같지만,
주어진 수가 [1, 7, 9, 9] 라고 했을 때,
1이 선택된 상태로 9가 선택되어 1 9 순열이 완성되고 리턴된 후 이어서 다시 9가 선택되면 또다시 1 9 순열이 생겨버린다.
즉, 같은 depth에서 같은 숫자를 사용하지 않도록 해야 한다.
그렇게 하는 방법은, numbers를 정렬하면 같은 숫자들은 모여있게 되기 때문에 같은 depth에서 이전에 사용했던 숫자를 temp에 저장해 두고, 그 숫자가 아닐 때 순열을 만드는 것이다. 모여있기 때문에 바로 이전 값만 저장해서 비교해도 문제없다.
N과 M 풀면서 여기서 처음으로 막혔다 ㅠ
728x90
반응형
'Algorithm > BackTracking' 카테고리의 다른 글
[Baekjoon 15665 / Python / 실버2] N과 M (11) (0) | 2024.08.10 |
---|---|
[Baekjoon 15664 / Python / 실버2] N과 M (10) (0) | 2024.08.09 |
[Baekjoon 15657 / Python / 실버3] N과 M (8) (0) | 2024.08.07 |
[Baekjoon 15656 / Python / 실버3] N과 M (7) (0) | 2024.08.07 |
[Baekjoon 15655 / Python / 실버3] N과 M (6) (0) | 2024.08.07 |