[알고리즘] 중복 순열 구하기(DFS)
(문제) 중복 순열 구하기(DFS)
1부터 N까지 번호가 적힌 구슬이 있습니다.
이 중 중복을 허락하여 M번을 뽑아 일렬로 나열하는 방법을 모두 출력합니다.
입력설명
첫 번째 줄에 자연수 N(3<=N<=10)과 M(2<=M<=N) 이 주어집니다.
출력설명
첫 번째 줄에 결과를 출력합니다.
맨 마지막 총 경우의 수를 출력합니다.
출력순서는 사전순으로 오름차순으로 출력합니다.
테스트케이스
입력예제 | 출력예제 |
---|---|
3 2 | 1 1 1 2 1 3 2 1 2 2 2 3 3 1 3 2 3 3 9 |
5 3 | 1 1 1 1 1 2 1 1 3 1 1 4 1 1 5 1 2 1 1 2 2 1 2 3 1 2 4 … 5 5 1 5 5 2 5 5 3 5 5 4 5 5 5 125 |
해결방법
dfs를 이용하여 트리의 형태가 node 3개씩을 갖는 트리라고 생각을 한다.
res 리스트를 n개 만큼 생성하여 0으로 초기화한다.
(res리스트는 중복될 수 값을 넣을 것이다.)
각 node에 들어갈 때마다, 반복문으로 돌린 수열의 값을 dfs를 통해 인덱스 위치를 나타내는 x를 통해서 res 인덱스에 값을 변경시킨다.
코드
def dfs(x):
global count
# x 인덱스가 m을 가르키는 경우 즉 인덱스 마지막을 넘어서를 가르키는 경우
# 요소 3개인 인덱스는 인덱스 2가 최대 -> 3일 경우 초과 그때 print
if x == m:
for j in range(m):
print(res[j], end=' ')
count = count + 1
print()
else:
# dfs를 여러번 반복
for i in range(1,n+1):
# res의 인덱스 값 부분을 i로 덮어씌운다
res[x] = i
dfs(x+1)
n, m = map(int,input().split())
# 순열
res = [0] * n
count = 0
dfs(0)
print(count)
댓글남기기