https://www.acmicpc.net/problem/15663
https://github.com/stellaluminary/Baekjoon
본 문제는 N과 M 시리즈 - 백트래킹 문제다.
15649번 N과 M (1) : https://aigong.tistory.com/427
15650번 N과 M (2) : https://aigong.tistory.com/428
15651번 N과 M (3) : https://aigong.tistory.com/475
15652번 N과 M (4) : https://aigong.tistory.com/476
15654번 N과 M (5) : https://aigong.tistory.com/480
15655번 N과 M (6) : https://aigong.tistory.com/481
15656번 N과 M (7) : https://aigong.tistory.com/482
15657번 N과 M (8) : https://aigong.tistory.com/483
15663번 N과 M (9) : https://aigong.tistory.com/484
15664번 N과 M (10) : https://aigong.tistory.com/485
15665번 N과 M (11) : https://aigong.tistory.com/486
15666번 N과 M (12) : https://aigong.tistory.com/487
처음 시도했던 방법은 counting을 통해 백트래킹을 진행한 것이다.
그러나 많은 시간이 소모되어 시간 초과가 나왔다.
def dfs(idx):
global m
if idx == m:
if s not in res:
res.append(copy.deepcopy(s))
return
for i in l:
if o[i] != 0:
s.append(i)
o[i] -= 1
dfs(idx+1)
s.pop()
o[i] += 1
import sys
import copy
input = sys.stdin.readline
n,m = map(int, input().split())
l = sorted(list(map(int, input().split())))
s = []
o = {i:0 for i in l}
for i in range(len(l)):
o[l[i]] += 1
res = []
dfs(0)
for i in res:
print(*i)
깊이가 깊어짐에 따라 해당 depth에서의 겹침이 존재하는지 존재한다면 생략하는 방향으로 진행한다.
이때 visit을 통한 활용과 더불어 overlap을 사용한다.
def dfs(idx):
global n, m
if idx == m:
print(*s)
return
overlap = 0
for i in range(n):
if not visit[i] and overlap != l[i]:
visit[i] = 1
s.append(l[i])
overlap = l[i]
dfs(idx+1)
visit[i] = 0
s.pop()
import sys
input = sys.stdin.readline
n,m = map(int, input().split())
l = sorted(list(map(int, input().split())))
visit=[0]*n
s = []
dfs(0)