알고리즘

N과 M 시리즈-백트래킹

삶은겨란 2022. 6. 26. 16:01

N과 M (1)

def dfs():
    if len(result)==m: # m개를 골랐으면 출력
        print(*result)
        return
    for i in range(1,n+1):
        if visited[i]==0: # 방문을 안했으면
            result.append(i) # 값을 저장
            visited[i]=1 # 방문 체크
            dfs()
            result.pop() # 값 제거
            visited[i]=0 # 방문 원래대로 돌리기

n,m=map(int,input().split())
result=[]
visited=[0]*(n+1)
dfs()

 

N과 M (2)

def dfs(s):
    if len(result)==m: # m개를 골랐으면 출력
        print(*result)
        return
    for i in range(s,n+1):
        if visited[i]==0: # 방문을 안했으면
            result.append(i) # 값을 저장
            visited[i]=1 # 방문 체크
            dfs(i+1) # 다음 값부터 
            result.pop() # 값 제거
            visited[i]=0 # 방문 원래대로 돌리기

n,m=map(int,input().split())
result=[]
visited=[0]*(n+1)
dfs(1)

 

N과 M (3)

def dfs():
    if len(result)==m: # m개를 골랐으면 출력
        print(*result)
        return
    for i in range(1,n+1):
        result.append(i) # 값을 저장
        dfs()
        result.pop() # 값 제거
           

n,m=map(int,input().split())
result=[]
dfs()
# 중복계산이 필요없으므로 visited를 삭제

 

N과 M (4)

def dfs(s):
    if len(result)==m: # m개를 골랐으면 출력
        print(*result)
        return
    for i in range(s,n+1):
        result.append(i) # 값을 저장
        dfs(i)
        result.pop() # 값 제거
           

n,m=map(int,input().split())
result=[]
dfs(1)

 

N과 M (5)

def dfs():
    if len(result)==m:
        print(*result)
        return
    for i in range(n):
        if not visited[i]:
            result.append(n_list[i])
            visited[i]=1
            dfs()
            result.pop()
            visited[i]=0


n, m = map(int,input().split())
n_list=list(map(int,input().split()))
result=[]
n_list.sort()
visited=[0]*n
dfs()

 

N과 M (6)

def dfs(cnt,idx):
    if cnt==m: # m개를 뽑았으면
        print(*result) # 결과를 출력
        return
    for i in range(idx,n):
        result.append(n_list[i])
        dfs(cnt+1, i+1)
        result.pop()

n,m=map(int,input().split())
n_list=list(map(int, input().split()))
n_list.sort()
result=[]
dfs(0,0)

 

N과 M (7)

def dfs():
    if len(result)==m:
        print(*result)
        return
    for i in range(n):
        result.append(n_list[i])
        dfs()
        result.pop()
        
n, m = map(int,input().split())
n_list=list(map(int,input().split()))
result=[]
n_list.sort()
dfs()

 

N과 M (8)

def dfs(s):
    if len(result)==m:
        print(*result)
        return
    for i in range(s,n):
        result.append(n_list[i])
        dfs(i)
        result.pop()


n, m = map(int,input().split())
n_list=list(map(int,input().split()))
result=[]
n_list.sort()
dfs(0)

 

N과 M (9)

def dfs():
    if len(result)==m:
        print(*result)
        return
    temp=0 # 중복을 확인하기 위한 변수
    for i in range(n):
        if visited[i]==0 and temp!=n_list[i]: # 방문하지 않았고, 중복이 아니라면
            result.append(n_list[i]) # 결과에 추가
            temp=n_list[i] # 다음에 중복을 확인하기 위한 값으로 설정
            visited[i]=1
            dfs()
            result.pop()
            visited[i]=0

n, m = map(int,input().split())
n_list=list(map(int,input().split()))
result=[]
visited=[0]*n
n_list.sort()
dfs()

 

N과 M (10)

# 비내림차순
# 중복 수열 제거
def dfs(s):
    if len(result)==m:
        print(*result)
        return
    temp=0 # 중복을 확인하기 위한 변수
    for i in range(s,n):
        if visited[i]==0 and temp!=n_list[i]: # 방문하지 않았고, 중복이 아니라면
            result.append(n_list[i]) # 결과에 추가
            temp=n_list[i] # 다음에 중복을 확인하기 위한 값으로 설정
            visited[i]=1
            dfs(i)
            result.pop()
            visited[i]=0

n, m = map(int,input().split())
n_list=list(map(int,input().split()))
result=[]
visited=[0]*n
n_list.sort()
dfs(0)

 

N과 M (11)

def dfs():
    if len(result)==m:
        print(*result)
        return
    temp=0 # 중복을 확인하기 위한 변수
    for i in range(n):
        if temp!=n_list[i]: # 방문하지 않았고, 중복이 아니라면
            result.append(n_list[i]) # 결과에 추가
            temp=n_list[i] # 다음에 중복을 확인하기 위한 값으로 설정
            dfs()
            result.pop()

n, m = map(int,input().split())
n_list=list(map(int,input().split()))
result=[]
n_list.sort()
dfs()

 

N과 M (12)

def dfs(s):
    if len(result)==m:
        print(*result)
        return
    temp=0 # 중복을 확인하기 위한 변수
    for i in range(s,n):
        if temp!=n_list[i]: # 방문하지 않았고, 중복이 아니라면
            result.append(n_list[i]) # 결과에 추가
            temp=n_list[i] # 다음에 중복을 확인하기 위한 값으로 설정
            dfs(i)
            result.pop()
          
n, m = map(int,input().split())
n_list=list(map(int,input().split()))
result=[]
n_list.sort()
dfs(0)