알고리즘/백준

[백준 15650][파이썬] N과 M (2)

2twix2 2022. 2. 14. 02:55

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

 

15650번: N과 M (2)

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

www.acmicpc.net

 

이전 문제인 (1)과 유사하지만 개인적으로 이게 더 쉬운 것 같다.

 

오름차순 정렬이라서 다음 수가 전의 수보다 크기만 하면 절대로 중복될 일이 없다. 따라서, 어떤 숫자가 sequence 안에 있는지 따로 확인해 줄 필요가 없다.

 

그래서 for문 범위도 헷갈리지 않게 1부터 N까지로 바꿨다. 그런데 코드를 보면 1이 들어갈 자리에 prev_num + 1이 들어가 있는 걸 볼 수 있는데 이건 오름차순 정렬을 위해 for문 범위를 sequence에 넣은 바로 전 숫자보다 큰 수부터 N까지로 한 것이다.

 

import sys

input = sys.stdin.readline

N, M = map(int, input().split())
sequence = []

def dfs(prev_num):
  if len(sequence) == M:
    print(' '.join(map(str, sequence)))
    return

  for i in range(prev_num + 1, N + 1):
    sequence.append(i)
    dfs(i)
    sequence.pop()


dfs(0)