본문 바로가기
알고리즘/BOJ

[BOJ] 15650번 N과M(2) / 사용언어 : 파이썬(python)

by 바른 호랑이 2021. 12. 16.
728x90
반응형

※ 문제링크

 

15650번: N과 M (2)

한 줄에 하나씩 문제의 조건을 만족하는 수열을 출력한다. 중복되는 수열을 여러 번 출력하면 안되며, 각 수열은 공백으로 구분해서 출력해야 한다. 수열은 사전 순으로 증가하는 순서로 출력해

www.acmicpc.net

※ 기본문제 

 

[BOJ] 15649번 N과M(1) / 사용언어 : 파이썬(python)

※ 문제링크 : https://www.acmicpc.net/problem/15649 15649번: N과 M (1) 한 줄에 하나씩 문제의 조건을 만족하는 수열을 출력한다. 중복되는 수열을 여러 번 출력하면 안되며, 각 수열은 공백으로 구분해서

data-is-power.tistory.com

※ 문제풀이

N, M = map(int, input().split())
# N, M = 3, 2
number_list = [x for x in range(1, N+1)] # 1부터 N까지의 숫자를 가진 리스트 생성
check_list = [False] * N # 방문기록를 작성 및 확인할 리스트 생성
arr_list = [] # 출력할 값을 넣을 리스트 생성

def dfs(start):
    if len(arr_list) == M:
        print(*arr_list)
        return
    
    for i in range(start, N):
        if i+1 in arr_list:
            continue
        check_list[i] = True
        arr_list.append(i+1)

        dfs(i+1)

        arr_list.pop()
        check_list[i] = False
dfs(0)

 

해당문제는 [BOJ] 15649번에서 조금 변형된 문제였다. 15649번이 순서를 고려한다는 점에서 순열에 가깝다면 해당문제는 순서는 고려하지 않는다는 점에서 조합에 가까운 문제로 생각하며 문제를 해결하였다. 기존에 있던 코드를 그대로 변형하기 보다는 보다 간단하게 일부 수정해보았고, 정상적으로 작동하는 것을 확인하였다. 15649번과 달라진 점은 재귀함수를 호출하여 반복문을 수행할때 시작점을 부여하여 앞서 수행한 숫자에 대해서는 탐색하지 않게 했다는 것이다.  

 

P.S 개발자가 되기위해 공부중입니다. 잘못된 부분을 댓글로 남겨주시면 학습하는데 큰 도움이 될 거 같습니다.

728x90
반응형

댓글