파이톨치

[BOJ][Python] 15650 N과 M(2) 본문

알고리즘

[BOJ][Python] 15650 N과 M(2)

파이톨치 2021. 7. 29. 10:00
728x90

[문제 및 출처]

https://www.acmicpc.net/problem/15650

 

15650번: N과 M (2)

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

www.acmicpc.net

[어떻게 풀까?]

문제의 조건은 다음과 같다.

1부터 N까지 자연수 중에서 중복 없이 M개를 고른 수열
고른 수열은 오름차순이어야 한다.

아! 그렇다면 내가 진행하고 있는 수보다 큰 수를 다음에 진행하면 되지 않을까?

이런식으로 말이다.

 

[코드]

N, M = map(int, input().split())

used = [False] * (N+1)
answer = []

def dfs(before, N, M):
    #조건에 충족하면 출력
    if len(answer) == M: 
        print(" ".join(map(str, answer)))
        return

    for i in range(before, N+1):
        if not used[i]: 
            used[i] = True
            answer.append(i)

            dfs(i+1, N, M)
            
            #다시초기화
            used[i] = False 
            answer.pop()

dfs(1, N, M)

[코드설명]

before이라는 변수를 만들어 주었다. 이 변수의 기능은 그 전에 진행했던 수를 체크해 주는 기능이다.

그 수보다 큰 수 부터 세주게 되면은 자연스레 오름차순이 되지 않을까?

728x90

'알고리즘' 카테고리의 다른 글

[BOJ][Python][15651] N과 M(4)  (0) 2021.07.31
[BOJ][Python] [15651] N과 M(3)  (0) 2021.07.30
[BOJ][Python][15649] N과 M(1)  (0) 2021.07.28
[BOJ][Python][10989] 카운팅 정렬  (0) 2021.07.24
[백준][python][1002] 터렛  (0) 2021.07.18